我想将Brush
对象转换为Color
,以便我可以在按钮点击时将任何xaml按钮背景颜色更改为light color
,但System.Windows.Forms.ControlPaint.Light()
仅采用颜色作为论点。
有没有其他方法可以达到这个目的?
答案 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);
}