2014-02-22 82 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