dotnet/maui · error · ArgumentException

Element must be of type Slider.

Error message

Element must be of type Slider.

What it means

MaterialSliderRenderer renders Material Design Slider elements on Android. SetElement casts the VisualElement to Slider and throws ArgumentException on type mismatch. The renderer wires SeekBar change listeners and reads Slider.ValueProperty, all of which require a Slider element.

Source

Thrown at src/Compatibility/Material/src/Android/MaterialSliderRenderer.cs:191

		}

		// SeekBar.IOnSeekBarChangeListener
		void SeekBar.IOnSeekBarChangeListener.OnProgressChanged(SeekBar seekBar, int progress, bool fromUser)
		{
			if (fromUser)
				((IElementController)Element).SetValueFromRenderer(Slider.ValueProperty, Value);
		}

		void SeekBar.IOnSeekBarChangeListener.OnStartTrackingTouch(SeekBar seekBar) => ((ISliderController)Element)?.SendDragStarted();

		void SeekBar.IOnSeekBarChangeListener.OnStopTrackingTouch(SeekBar seekBar) => ((ISliderController)Element)?.SendDragCompleted();

		// IVisualElementRenderer
		VisualElement IVisualElementRenderer.Element => Element;
		VisualElementTracker IVisualElementRenderer.Tracker => _visualElementTracker;
		AView IVisualElementRenderer.View => this;
		void IVisualElementRenderer.SetElement(VisualElement element) =>
			Element = (element as Slider) ?? throw new ArgumentException($"Element must be of type {nameof(Slider)}.");
		void IVisualElementRenderer.UpdateLayout() =>
			_visualElementTracker?.UpdateLayout();

		SizeRequest IVisualElementRenderer.GetDesiredSize(int widthConstraint, int heightConstraint)
		{
			Measure(widthConstraint, heightConstraint);
			return new SizeRequest(new Size(Control.MeasuredWidth, Control.MeasuredHeight), new Size());
		}

		void IVisualElementRenderer.SetLabelFor(int? id)
		{
			if (_defaultLabelFor == null)
				_defaultLabelFor = ViewCompat.GetLabelFor(this);

			ViewCompat.SetLabelFor(this, (int)(id ?? _defaultLabelFor));
		}

View on GitHub (pinned to f377ff1c5e)

Solutions

  1. Verify ExportRenderer maps Slider to MaterialSliderRenderer.
  2. Ensure custom slider-like controls derive from Slider if they use this renderer.
  3. Audit for conflicting Slider registrations across all referenced assemblies.
  4. If migrating, update both element and renderer types together.

Example fix

// before
[assembly: ExportRenderer(typeof(Stepper), typeof(MaterialSliderRenderer))]

// after
[assembly: ExportRenderer(typeof(Slider), typeof(MaterialSliderRenderer))]
Defensive patterns

Strategy: type-guard

Validate before calling

if (element is not Slider)
    throw new InvalidOperationException($"Expected Slider, got {element?.GetType().Name}");
renderer.SetElement(element);

Type guard

static bool IsSlider(VisualElement? element) => element is Slider;

Prevention

When it happens

Trigger: A non-Slider element is dispatched to MaterialSliderRenderer through incorrect registration. Occurs when custom stepper or range controls are accidentally mapped to the Slider renderer.

Common situations: Confusing Slider with Stepper in ExportRenderer mappings. Custom range controls registered against MaterialSliderRenderer without deriving from Slider. Stale registrations after refactoring.

Related errors


AI-assisted analysis of dotnet/maui@f377ff1c5e (2026-08-13). Data as JSON: /api/errors/6b26a0f02c07991e. Report an issue: GitHub.