C# 为什么此画笔的#00FFFFFF值不等于画笔。透明?
我正在通过反射从另一个类检索笔刷列表。我想确保此列表中的某些笔刷不是透明的(C# 为什么此画笔的#00FFFFFF值不等于画笔。透明?,c#,wpf,C#,Wpf,我正在通过反射从另一个类检索笔刷列表。我想确保此列表中的某些笔刷不是透明的(#00FFFFFF)。 但是,将其与画笔进行比较。Transparent返回false,即使该值实际上是#00FFFFFF var brushes = GetListOfBrushes(); var brush = brushes.First(c => c != Brushes.Transparent); Console.WriteLine(brush); // Prints "#00FFFFFF" 在这
#00FFFFFF
)。
但是,将其与画笔进行比较。Transparent
返回false,即使该值实际上是#00FFFFFF
var brushes = GetListOfBrushes();
var brush = brushes.First(c => c != Brushes.Transparent);
Console.WriteLine(brush); // Prints "#00FFFFFF"
在这种情况下,唯一可靠的方法是检查它的字符串表示形式,如果它以感觉不太好的“#00”开头
在下面的示例屏幕截图中,First()
调用返回的画笔与谓词匹配,尽管它不应该:
由于您比较画笔,您可能需要执行
Cast()
或进行一些预过滤,如果它们不是纯色(即默认情况下不透明)
然后,您可以将
brush.Color
与brush.Transparent.Color
进行比较。根据字符串表示,我推断您使用的是System.Windows.Media.brush
,而不是System.Drawing.brush
System.Windows.Media.Brush
尚未实现自己版本的Equals()
。因此您的比较
c != Brushes.Transparent
仅比较参考等式,而不比较相等值。一种解决方案是比较不透明度:
var brush = brushes.First(c => c.Opacity != Brushes.Transparent.Opacity);
但是,根据您的需要或您想如何识别特殊笔刷,您可能需要比较更多属性。这也将捕获无命中测试透明(
#00000000
)不过,我只是比较一下Color
@H.B。我对wpf没有太多经验,只是在System.Windows.Media.Brush
中找不到Color
属性。它只存在于solidcolorbush
,您需要转换笔刷(如我的回答中所述)。画笔的不透明度为1,即使alpha为00。SolidColorBrush类不会覆盖Equals+GetHashCode。这并不是一个大谜团,如果0x00ffffff的透明度大于或小于0x00ff0000,这是相当有争议的。您必须设置自己的规则,检查alpha是否合理。