2014-02-22 108 views
7

我想將Brush對象轉換爲Color,以便在按鈕單擊時將任何xaml按鈕背景顏色更改爲其light color,但System.Windows.Forms.ControlPaint.Light()僅將顏色作爲參數。將畫筆轉換爲顏色

是否有一些替代方案來實現這一目標?

+0

你的意思是'System.Windows.Media.Brush'或'System.Drawing.Brush'嗎?此外,我會看看'System.Drawing.Color.FromArgb()' – davidsbro

+0

@davidsbro System.Windows.Media.Brush –

+1

請注意,如果它實際上是一個'SolidColorBrush',它具有'Color'屬性。 – Benjol

回答

5

您不需要參考巨大的Windows.Forms dll 只需即可減輕Color。簡單而言,你只是相同的因子乘以每個值:

private Color AdjustBrightness(double brightnessFactor) 
{ 
    Color originalColour = Color.Red; 
    Color adjustedColour = Color.FromArgb(originalColour.A, 
     (int)(originalColour.R * brightnessFactor), 
     (int)(originalColour.G * brightnessFactor), 
     (int)(originalColour.B * brightnessFactor)); 
    return adjustedColour; 
} 

這當然可以通過多種方式改善(也應該),但你的想法。事實上,如果一個值超過255,這會拋出一個Exception,但我相信你可以處理這個問題。現在你只需要檢查你需要照亮什麼類型的Brush

if (brush is SolidColorBrush) 
    return new SolidColorBrush(AdjustBrightness(((SolidColorBrush)brush).Color)); 
else if (brush is LinearGradientBrush || brush is RadialGradientBrush) 
{ 
    // Go through each `GradientStop` in the `Brush` and brighten its colour 
} 
6

,你可以嘗試讓刷的A,RGB值,然後將它們傳遞到System.Drawing.Color.FromARGB()僞代碼:

Brush br = Brushes.Green; 
byte a = ((Color)br.GetValue(SolidColorBrush.ColorProperty)).A; 
byte g = ((Color)br.GetValue(SolidColorBrush.ColorProperty)).G; 
byte r = ((Color)br.GetValue(SolidColorBrush.ColorProperty)).R; 
byte b = ((Color)br.GetValue(SolidColorBrush.ColorProperty)).B; 
System.Windows.Forms.ControlPaint.Light(
    System.Drawing.Color.FromArgb((int)a,(int)r,(int)g,(int)b)); 

我不是一個WPF的專家,更主要的,我認爲你需要要記住,最簡單的做法是使用System.Drawing.Color.FromArgb()甚至System.Drawing.Color.FromName()

1

在我來說,我已經做到了像這樣(擴展方法):

public static class BrushExtension 
{ 

    public static Color GetColor(this Brush brush) 
    { 
     return new Pen(brush).Color; 
    } 

} 

,並調用它像Color brushColor = myBrush.GetColor();

+0

@downvoter我不介意,如果它帶有「爲什麼」? – Joel