在MonoAndroid(Xamarin.Android)中创建.NET等效的Colors静态类

本文关键字:NET 静态类 Colors 创建 MonoAndroid Xamarin Android | 更新日期: 2023-09-27 18:28:10

Android API中的许多Canvas方法需要定义Paint对象才能定义颜色。这样做的方法是,

Paint myPaintObject = new Paint();
myPaintObject.Color = Color.Red;
canvas.DrawRect(..., myPaintObject);

如果它看起来像这样会更好,

canvas.DrawRect(..., Colors.Red);

解决方案类可能如下所示。。。

public static class Colors
{
    public static Paint Red { get { return GetColors(Color.Red); } }
    public static Paint Black { get { return GetColors(Color.Black); } }
    private static Paint GetColors(Color color)
    {
        Paint paint = new Paint ();
        paint.Color = color;
        return paint;
    }
}

但是,必须为每种可用的颜色创建getter,这将是一种糟糕的做法。有什么让这更容易的想法吗?

edit:LINQ是一个很好的解决方案。根据@ChrisSinclair关于用SolidColorBrush笔刷填充列表的评论

this.Colors = typeof(Color)
    .GetProperties(System.Reflection.BindingFlags.Static | 
                   System.Reflection.BindingFlags.Public)
        .ToDictionary(p => p.Name, 
                      p => new Paint() 
                      { Color = ((Color)p.GetValue(null, null)) });

当调用时,看起来像

canvas.DrawRect(..., Colors["Red"]);

在MonoAndroid(Xamarin.Android)中创建.NET等效的Colors静态类

我只推荐一种从Color转换为Paint:的扩展方法

 public static Paint AsPaint(this Color color)
 {
    Paint paint = new Paint ();
    paint.Color = color;
    return paint;          
 }

这将允许你写,对于任何颜色:

canvas.DrawRect(..., Color.Red.AsPaint());

这里的一个优点是,您不会隐瞒每次都要创建Paint实例的事实。使用Colors.Red表明您正在创建一个Color,而不是Paint,并掩盖了它是用每个调用构建的。

否则,如果您希望为每个属性创建一个Colors类,则需要为每个Color提供一个属性来支持。这可以通过编写源文件的创建脚本来完成,但如果不为每种颜色编写属性,就无法直接创建所有这些"颜色"。