xamarin - Xamarin Switch 'Tint Colour' Android 渲染器使开关消失
问题描述
我正在为 Xamarin Forms 实现自定义渲染器。我想要做的就是改变开关的开启颜色......
我的开关 & 有一个自定义类,并添加了一个可绑定的“TintColour”属性。
public class ExtendedSwitch : Switch
{
//Solution from: https://github.com/XLabs/Xamarin-Forms-Labs/blob/master/src/Forms/XLabs.Forms/Controls/ExtendedSwitch.cs
/// <summary>
/// Bindable tint colour property (sets colour of switch).
/// </summary>
public static readonly BindableProperty TintColorProperty = BindableProperty.Create(
nameof(TintColor),
typeof(Color),
typeof(ExtendedSwitch),
defaultValue: Color.FromHex(Constants.kProtirusBlueHexString)
);
/// <summary>
/// Gets or sets the color of the tint.
/// </summary>
/// <value>The color of the tint.</value>
public Color TintColor
{
get { return (Color)GetValue(TintColorProperty); }
set { SetValue(TintColorProperty, value); }
}
}
我在 XAML 中设置了我的开关:
<controls:ExtendedSwitch TintColor="Black" Grid.Column="2" Grid.Row="0" IsToggled="true"/>
<controls:ExtendedSwitch TintColor="Green" Grid.Column="2" Grid.Row="1" IsToggled="true"/>
<controls:ExtendedSwitch TintColor="Gray" Grid.Column="2" Grid.Row="2" IsToggled="true"/>
<controls:ExtendedSwitch TintColor="Blue" Grid.Column="2" Grid.Row="3" IsToggled="true"/>
<controls:ExtendedSwitch TintColor="#ff9200" Grid.Column="2" Grid.Row="4" IsToggled="true"/>
<controls:ExtendedSwitch TintColor="Gray" Grid.Column="2" Grid.Row="5" IsToggled="true"/>
<controls:ExtendedSwitch TintColor="Red" Grid.Column="2" Grid.Row="6" IsToggled="true"/>
我已经在 iOS 上实现了一个渲染器:
public class ExtendedSwitchRenderer : SwitchRenderer
{
/// <summary>
/// Get the current state of Extended Switch.
/// </summary>
/// <value>The element.</value>
public new ExtendedSwitch Element
{
get { return (ExtendedSwitch)base.Element; }
}
/// <summary>
/// Apply Tint Colour to Switch.
/// </summary>
/// <param name="sender">Sender.</param>
/// <param name="e">E.</param>
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (Control != null)
{
Control.OnTintColor = Element.TintColor.ToUIColor();
}
}
}
看看它看起来多么美丽......
现在,我们来实现一个 android 渲染器,它只是拒绝工作。
首先我会说这必须在代码中完成,我不能使用样式/主题来实现这一点,因为每个开关必须是不同的颜色。
首先让我们看看我的 android 代码:**EDIT***我添加了完整的渲染器类,而不仅仅是影响开关的代码*
public class ExtendedSwitchRenderer : SwitchRenderer
{
public ExtendedSwitchRenderer(Context context) : base(context)
{
}
/// <summary>
/// Get the current state of Extended Switch.
/// </summary>
/// <value>The element.</value>
public new ExtendedSwitch Element
{
get { return (ExtendedSwitch)base.Element; }
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (Control != null)
{
this.SetTintColor(Element.TintColor);
}
}
/// <summary>
/// Sets the color of the tint.
/// </summary>
/// <param name="color">The color.</param>
private void SetTintColor(Xamarin.Forms.Color color)
{
//Colours currently hard coded but I will pass `Element.TintColour` to them
Android.Graphics.Color colorOn = Android.Graphics.Color.Green;
Android.Graphics.Color colorOff = Android.Graphics.Color.Gray;
Android.Graphics.Color colorDisabled = Android.Graphics.Color.Green;
StateListDrawable drawable = new StateListDrawable();
drawable.AddState(new int[] { Android.Resource.Attribute.StateChecked }, new ColorDrawable(colorOn));
drawable.AddState(new int[] { -Android.Resource.Attribute.StateEnabled }, new ColorDrawable(colorDisabled));
drawable.AddState(new int[] { }, new ColorDrawable(colorOff));
this.Control.ThumbDrawable = drawable;
}
}
当我在打开开关的情况下加载页面时,它们完全消失了。没有设置颜色,也没有开关。
我也尝试过设置Control.ThumbStateList
,ColorStateList
但是发生了完全相同的事情,开关消失了。
我怎样才能让它工作?我检查了XLabs Forms 实现此渲染器的代码,它与我的相同,但不起作用。有没有人知道如何设置它,以便在 Android 上选择我的开关时具有不同的颜色。
旁注,我不想使用效果。我按照本指南中的步骤使用效果实现相同的目标。但这甚至在 iOS 上也不起作用,所以我比现在落后了一步......
任何和所有的帮助将不胜感激!