Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么此画笔的#00FFFFFF值不等于画笔。透明?_C#_Wpf - Fatal编程技术网

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是否合理。