我想将Brush
对象转换为Color
,以便在按钮单击时将任何xaml按钮背景颜色更改为其light color
,但System.Windows.Forms.ControlPaint.Light()
仅将颜色作为参数。将画笔转换为颜色
是否有一些替代方案来实现这一目标?
我想将Brush
对象转换为Color
,以便在按钮单击时将任何xaml按钮背景颜色更改为其light color
,但System.Windows.Forms.ControlPaint.Light()
仅将颜色作为参数。将画笔转换为颜色
是否有一些替代方案来实现这一目标?
您不需要参考巨大的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
}
,你可以尝试让刷的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()
。
在我来说,我已经做到了像这样(扩展方法):
public static class BrushExtension
{
public static Color GetColor(this Brush brush)
{
return new Pen(brush).Color;
}
}
,并调用它像Color brushColor = myBrush.GetColor();
@downvoter我不介意,如果它带有“为什么”? – Joel
你的意思是'System.Windows.Media.Brush'或'System.Drawing.Brush'吗?此外,我会看看'System.Drawing.Color.FromArgb()' – davidsbro
@davidsbro System.Windows.Media.Brush –
请注意,如果它实际上是一个'SolidColorBrush',它具有'Color'属性。 – Benjol