将画笔转换为颜色

时间:2014-02-22 23:13:44

标签: c# wpf winforms xaml colors

我想将Brush对象转换为Color,以便我可以在按钮点击时将任何xaml按钮背景颜色更改为light color,但System.Windows.Forms.ControlPaint.Light()仅采用颜色作为论点。

有没有其他方法可以达到这个目的?

5 个答案:

答案 0 :(得分:8)

您可以尝试获取画笔的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()。< / p>

答案 1 :(得分:8)

您无需引用巨大的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
}

答案 2 :(得分:6)

就我而言,我这样做了(扩展方法):

public static class BrushExtension
{

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

}

并将其称为Color brushColor = myBrush.GetColor();

答案 3 :(得分:4)

尝试一下:

        Brush brush = Brushes.Yellow;
        Color color = ((SolidColorBrush) brush).Color;

答案 4 :(得分:-1)

如果需要将 WPF System.Windows.Media.Brush 转换为 System.Drawing.Color

public static System.Drawing.Color BrushToColor(System.Windows.Media.Brush brush)
{
    var col = ((SolidColorBrush) brush).Color;
    return System.Drawing.Color.FromArgb(col.A, col.R, col.G, col.B);
}