gpt4 book ai didi

使用自定义渲染器时未触发 Xamarin Forms Switch 的 Toggled 事件

转载 作者:行者123 更新时间:2023-12-02 14:16:41 25 4
gpt4 key购买 nike

我有一个 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);
}
}

使用上面的代码:

enter image description here

使用下面建议的代码:

enter image description here

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);
}
}
}

最佳答案

在 IO 渲染器上

protected override void OnElementChanged(ElementChangedEventArgs<Switch> e)
{
base.OnElementChanged(e);



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

CustomSwitch s = Element as CustomSwitch;



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

}

以及 OnCheckedChange 中的 Android 渲染器

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

Element.IsToggled = Control.Checked;


}

关于使用自定义渲染器时未触发 Xamarin Forms Switch 的 Toggled 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49448206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com