2013-04-04 40 views
2

我要創建使用下列成語的一個C#(不XAML)顏色:基於另一種顏色和alpha創建System.Drawing.Color的擴展方法或子類?

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是一個結構,而不是一個類)。

+3

嗯,是的,你可以很容易地編寫這樣一個擴展方法(雖然我建議稱之爲WithAlpha而非SetAlpha)。你試過了什麼,出了什麼問題? – 2013-04-04 19:42:37

+0

@JonSkeet哈,正是我最後稱之爲我的回答 – 2013-04-04 19:44:40

+0

@JonSkeet出了什麼問題,我不知道從哪裏開始:P完全新的擴展方法... – heltonbiker 2013-04-04 19:46:35

回答

2

怎麼是這樣的:

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); 

進一步閱讀

+0

「關鍵是第一個參數中的this關鍵字,它(以及靜態方法在靜態類)向編譯器表明這是一種擴展方法。「這是分散在文檔中(我最近被燒燬......:oP)。謝謝!! – heltonbiker 2013-04-04 19:51:20

+0

+1不錯的清潔解決方案。 – 2013-06-07 21:22:33

相關問題