/ / Переключена подія перемикача Xamarin Forms не запускається під час користувальницького візуалізатора - xamarin, xamarin.forms

Xamarin Forms Переключений подія перемикача не спрацьовує при використанні користувальницького рендерінгу - xamarin, xamarin.forms

Я маю Xamarin.Forms додаток, і я створив спеціальний Switch як зазначено нижче:

public class ExtSwitch : Switch
{
public static readonly BindableProperty SwitchOnColorProperty =
BindableProperty.Create(nameof(SwitchOnColor),
typeof(Color), typeof(ExtSwitch), Color.Default);

public Color SwitchOnColor
{
get { return (Color)GetValue(SwitchOnColorProperty); }
set { SetValue(SwitchOnColorProperty, value); }
}

// More codes here //
}

В моєму XAML Я використовував це так:

<local:ExtSwitch Grid.Column = "2"
IsToggled="{Binding IsToggled}"
Toggled="Handle_Toggled"
SwitchThumbColor="White"
SwitchOnColor="Red"
SwitchOffColor="Gray"
HorizontalOptions="End"
VerticalOptions="Center" />

У моєму коді C # у мене є Handle_Toggled метод, який обробляє те, що сталося, коли Swich перемикається. Але якось Toggled подія не запускається при використанні всередині мого користувацького комутатора, але чудово працює, коли використовується в звичайному комутаторі.

Хтось може вказати мені, чого мені тут не вистачає або що я роблю не так?

Редагувати:

Спеціальний візуалізатор в iOS:

class ExtSwitchRenderer : SwitchRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Switch> e)
{
base.OnElementChanged(e);

if (e.OldElement != null || e.NewElement == null) return;

ExtSwitch s = Element as ExtSwitch;

UISwitch sw = new UISwitch();
sw.ThumbTintColor = s.SwitchThumbColor.ToUIColor();
sw.OnTintColor = s.SwitchOnColor.ToUIColor();

SetNativeControl(sw);
}
}

Використовуючи наведений вище код:

введіть опис зображення тут

Використовуючи запропонований нижче код:

введіть опис зображення тут

Спеціальний візуалізатор в Android:

public class ExtSwitchRenderer : SwitchRenderer
{
public ExtSwitchRenderer(Context context) : base(context) { }
ExtSwitch s;

protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Switch> e)
{
base.OnElementChanged(e);
if (e.OldElement != null || e.NewElement == null)
return;

s = Element as ExtSwitch;
if (this.Control != null)
{
if (this.Control.Checked)
{
this.Control.TrackDrawable.SetColorFilter(s.SwitchOnColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
}
else
{
this.Control.TrackDrawable.SetColorFilter(s.SwitchOffColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
}
this.Control.CheckedChange += this.OnCheckedChange;
}
Control.Toggle();
}

void OnCheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
{
if (this.Control.Checked)
{
this.Control.ThumbDrawable.SetColorFilter(s.SwitchOnColor.ToAndroid(), PorterDuff.Mode.Multiply);
this.Control.TrackDrawable.SetColorFilter(s.SwitchOnColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
}
else
{
this.Control.ThumbDrawable.SetColorFilter(s.SwitchOffColor.ToAndroid(), PorterDuff.Mode.Multiply);
this.Control.TrackDrawable.SetColorFilter(s.SwitchOffColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
}
}
}

Відповіді:

0 для відповіді № 1

Не встановлюйте власний елемент керування, замість цього просто оновіть поточний елемент керування, наприклад:

this.Control.ThumbTintColor = s.SwitchThumbColor.ToUIColor();
this.Control.OnTintColor = s.SwitchOnColor.ToUIColor();

І там не потрібно телефонувати SetNativeControl