Я использую пользовательский рендер для 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:
** РЕДАКТИРОВАТЬ *** Я добавил полный класс рендерера, а не просто код, влияющий на переключатель *
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, поэтому я был на шаг позади того, где я сейчас нахожусь ...
Любая и вся помощь будет оценена!