Xamarin:如何将Android中的步进器颜色更改为iOS中的颜色?

Xamarin:如何将Android中的步进器颜色更改为iOS中的颜色?,xamarin,xamarin.forms,xamarin.android,Xamarin,Xamarin.forms,Xamarin.android,我有Xamarin PCL应用程序,它使用步进器。我想更改步进器按钮的颜色,现在使用以下渲染器 在PCL中: public class MyStepper : Stepper { public static readonly BindableProperty ColorProperty = BindableProperty.Create(nameof(Color), typeof(Color), typeof(MyStepper), Color.Default);

我有Xamarin PCL应用程序,它使用
步进器
。我想更改步进器按钮的颜色,现在使用以下渲染器

在PCL中:

public class MyStepper : Stepper
{
   public static readonly BindableProperty ColorProperty = 
            BindableProperty.Create(nameof(Color), typeof(Color), typeof(MyStepper), Color.Default);

   public Color MyColor
   {
      get { return (Color)GetValue(ColorProperty); }
      set { SetValue(ColorProperty, value); }
   }
}
在iOS中:

public class MyStepperRenderer : StepperRenderer
{
   protected override void OnElementChanged(ElementChangedEventArgs<Stepper> e)
   {
      base.OnElementChanged(e);
      MyStepper s = Element as MyStepper;

      if (Control != null)
         Control.TintColor = s.MyColor.ToUIColor();
   }
}
公共类mystepperrender:stepperrender
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
MyStepper s=作为MyStepper的元素;
if(控件!=null)
Control.TintColor=s.MyColor.ToUIColor();
}
}

在Android中:

protected override void OnElementChanged(ElementChangedEventArgs<Stepper> e)
{
   base.OnElementChanged(e);
   MyStepper s = Element as MyStepper;

   if (Control != null)
   {
      Control.GetChildAt(0).Background.SetColorFilter(s.MyColor.ToAndroid(), PorterDuff.Mode.Multiply);
      Control.GetChildAt(1).Background.SetColorFilter(s.MyColor.ToAndroid(), PorterDuff.Mode.Multiply);
    }
}
protected override void OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
MyStepper s=作为MyStepper的元素;
if(控件!=null)
{
Control.GetChildAt(0.Background.SetColorFilter(s.MyColor.ToAndroid(),PorterDuff.Mode.Multiply);
Control.GetChildAt(1.Background.SetColorFilter(s.MyColor.ToAndroid(),PorterDuff.Mode.Multiply);
}
}

在XAML中:

<local:MyStepper MyColor="Red" Maximum="10" Minimum="0" ....... />


正如预期的那样,它将像附加的图像一样工作。但是,是否有可能让Android颜色只改变按钮的“轮廓”,就像它在iOS中的外观一样?

如果您创建了一个自定义的可绘制向量,您就可以这样做

按钮\u border.xml

将此文件放在Android
Resources\drawable
文件夹中,并确保构建操作设置为
AndroidResource


mystepperrender.cs

然后您只需要将其设置为两个按钮的背景

protected override void OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
var s=作为MyStepper的元素;
if(控件!=null)
{
GetChildAt(0).SetBackground(Resources.GetDrawable(Resource.Drawable.button_border));
GetChildAt(1).SetBackground(Resources.GetDrawable(Resource.Drawable.button_border));
Control.GetChildAt(0.Background.SetColorFilter(s.MyColor.ToAndroid(),PorterDuff.Mode.Multiply);
Control.GetChildAt(1.Background.SetColorFilter(s.MyColor.ToAndroid(),PorterDuff.Mode.Multiply);
}
}
这将看起来像:

讨论

  • 您可以释放状态,如按下、禁用。。。(见附件)
如果没有很多不同的颜色,请使用状态创建一个可绘制的图形,并在渲染器中设置它们,而不是设置单一颜色。因此,您的用户将获得更好的反馈

把-和+的颜色也改成红色怎么样。有没有办法做到这一点

根据@Sven Michael Stübe的回答,我添加了一些代码来更改“-”和“+”颜色:

按钮\u border.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@color/colorAccent" android:state_pressed="true"/>
  <item android:drawable="@color/colorPrimaryDark" android:state_focused="true"/>
  <item android:drawable="@drawable/button_border"/>
</selector>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle" >

  <solid android:color="#00FFFFFF" />
  <corners android:radius="5dp" />
  <stroke
    android:width="2dp"
    android:color="#FFFFFF" />

</shape>

谢谢,把-和+的颜色也改成红色怎么样。有没有办法做到这一点?我只有红色,所以您可以解释一下“在渲染器中设置它们,以便用户获得更好的反馈”是什么意思。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle" >

  <solid android:color="#00FFFFFF" />
  <corners android:radius="5dp" />
  <stroke
    android:width="2dp"
    android:color="#FFFFFF" />

</shape>