C# 取消标记时保留开关的颜色

C# 取消标记时保留开关的颜色,c#,xaml,xamarin,xamarin.forms,C#,Xaml,Xamarin,Xamarin.forms,我正在使用xamarin表单中的开关。切换时,如果为真,则颜色为粉红色,如果为假,则颜色为灰色 当我禁用开关时,因为我不希望用户切换。然后颜色变为灰色 如何保留开关的颜色。当它被禁用且为真时,它应为默认颜色,而不是灰色 你能建议我如何做到这一点吗 <Switch IsToggled="True" IsEnabled="False"/> 谢谢 Rao我对这个问题进行了一些调查,我发现了两种解决方案: 捷径 使用专用布尔变量,而不是使用IsEnabled属性。然后,在处理单击的事件

我正在使用xamarin表单中的开关。切换时,如果为真,则颜色为粉红色,如果为假,则颜色为灰色

当我禁用开关时,因为我不希望用户切换。然后颜色变为灰色

如何保留开关的颜色。当它被禁用且为真时,它应为默认颜色,而不是灰色

你能建议我如何做到这一点吗

<Switch IsToggled="True" IsEnabled="False"/>

谢谢
Rao

我对这个问题进行了一些调查,我发现了两种解决方案:

捷径 使用专用布尔变量,而不是使用
IsEnabled
属性。然后,在处理单击的事件时,使用变量检查开关的状态

艰难的道路 覆盖开关控件以获得此行为。你可以跟着

从for
Xamarin.Forms
中可以看到,目前没有指定颜色的选项。最后,您必须为
iOS
Android
创建自己的渲染器

安卓 本质上,您需要做的是重写
OnElementChanged
OnCheckChanged
事件,并检查
控件的
Checked
属性。之后,您可以设置
控件的
ThumbDrawable
,并使用您想要应用的颜色执行
SetColorFilter
。尽管这样做需要Android 5.1+。给出了一个实例

您还可以创建并使用并为添加新值,最后还可以创建默认值。Android 4.1+支持这一点。详细提供了使用
StateListDrawable
的示例

网间网操作系统 iOS稍微简单一些。只需创建自己的
SwitchRenderer
,覆盖
OnElementChanged
事件并设置and


我希望这会有所帮助。

在这种情况下,您需要为控件制作自定义渲染器,并在颜色更改时进行切换:

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

        this.Control.ThumbDrawable.SetColorFilter(this.Control.Checked ? Color.DarkGreen : Color.Red, PorterDuff.Mode.SrcAtop);
        this.Control.TrackDrawable.SetColorFilter(this.Control.Checked ? Color.Green : Color.Red, PorterDuff.Mode.SrcAtop);

        this.Control.CheckedChange += this.OnCheckedChange;
    }

    private void OnCheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
    {
        this.Control.ThumbDrawable.SetColorFilter(this.Control.Checked ? Color.DarkGreen : Color.Red, PorterDuff.Mode.SrcAtop);
        this.Control.TrackDrawable.SetColorFilter(this.Control.Checked ? Color.Green : Color.Red, PorterDuff.Mode.SrcAtop);
    }
}
类CustomSwitchRenderer:SwitchRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
this.Control.ThumbDrawable.SetColorFilter(this.Control.Checked?Color.DarkGreen:Color.Red,PorterDuff.Mode.SrcAtop);
this.Control.TrackDrawable.SetColorFilter(this.Control.Checked?Color.Green:Color.Red,PorterDuff.Mode.SrcAtop);
this.Control.CheckedChange+=this.OnCheckedChange;
}
私有void OnCheckedChange(对象发送方,CompoundButton.CheckedChangeEventArgs e)
{
this.Control.ThumbDrawable.SetColorFilter(this.Control.Checked?Color.DarkGreen:Color.Red,PorterDuff.Mode.SrcAtop);
this.Control.TrackDrawable.SetColorFilter(this.Control.Checked?Color.Green:Color.Red,PorterDuff.Mode.SrcAtop);
}
}