【问题标题】:Extension method or subclass to create a System.Drawing.Color based on another color and an alpha?基于另一种颜色和 alpha 创建 System.Drawing.Color 的扩展方法或子类?
【发布时间】:2013-04-04 19:40:13
【问题描述】:

我想使用以下习语之一在 C#(不是 XAML)中创建颜色:

Color transparentblue = TransparentColor(Brushes.Blue, 0.5); // 0.5 => 128
Color transparentblue = Brushes.Blue.SetAlpha(0.5);  // again, 0.5 => 128

我想摆脱Color.FromArgb() 语法,这对设计师来说根本不友好。我也让它在静态类中使用静态方法,但写作有点沉重:

public static class ColorGenerators {        
    public static Color GetTransparentColor (Color color, double opacity) {
        byte op = (byte)(opacity*255);

        return Color.FromArgb(op, color.R, color.G, color.B);
    }
}

// To be used as
var transparentblue = ColorGenerators.GetTransparentColor(Color.Blue, 0.5);

我仍然更喜欢扩展方法方法,在我看来,我们公司很快就会从类似于this question 中描述的方法中受益,所以我想知道它们会是什么样子(假设 Color 是一个结构,而不是一个类)。

【问题讨论】:

  • 嗯,是的,您可以轻松编写这样的扩展方法(尽管我建议将其称为 WithAlpha 而不是 SetAlpha)。您尝试了什么,出了什么问题?
  • @JonSkeet ha,这正是我最终在回答中所说的
  • @JonSkeet 出了问题的是我不知道从哪里开始:P 对扩展方法完全陌生...
  • @heltonbiker:好的,那么您是否先尝试在 MSDN 上搜索它们?我的第一击是msdn.microsoft.com/en-gb/library/vstudio/bb383977.aspx

标签: c# extension-methods system.drawing.color


【解决方案1】:

这样的事情怎么样:

public static class ColorExtensions
{        
    public static Color WithAlpha(this Color color, double opacity) 
    {
        byte op = (byte)(opacity*255);
        return Color.FromArgb(op, color.R, color.G, color.B);
    }
}

关键是第一个参数中的this关键字。这(以及作为static 类中的static 方法)向编译器表明这是一个扩展方法。

Color transparentblue = Color.Blue.WithAlpha(0.5);

进一步阅读

【讨论】:

  • “关键是第一个参数中的 this 关键字。它(以及作为静态类中的静态方法)向编译器表明这是一个扩展方法。”那是分散在文档中的(我最近很筋疲力尽......:oP)。谢谢!!
猜你喜欢
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多