如何比较 SolidColorBrushes?
How to Compare SolidColorBrushes?
我正在尝试比较 2 支画笔,如您在图片中所见。我不知道为什么它会失败...
如果对象具有相同的引用(不包括重载),则从 DependencyObject
派生的 类 只会相等 (.Equals() == true
)。仅当使用了实际的相同对象时才会出现这种情况,或者 BrushConverter.ConvertFrom
返回 SolidColorBrush
的相同实例。这种情况不太可能,只是一种假设。
喜欢评论已经提到:尝试比较Color
and/or 纯色画笔的其他属性。 Color
是一个实现 IEquatable<Color>
的结构,将产生正确的行为。
来源:
它们不会相等,因为它正在进行引用比较并且它们是堆中具有相同属性的两个不同引用。
如果你想控制对象比较,你应该实现IEqualtable
接口。然后你可以说出必须如何比较对象。然而,在这种情况下,由于 SolidColorBrush
是 .NET class,我们无法实现 IEquatable
。有不同的选择
1) 在 SolidColorBrush
上使用扩展方法,将画笔实例与另一个进行比较。不过在这种情况下不是一个很好的解决方案。
2) 最好的办法可能是使用 IEqualityComparer
界面。您创建一个单独的 class 实现 IEqualityComparer
,它将定义如何比较 2 个不同的对象。例如,在您的示例中,您可能想要比较 SolidColorBrush 的颜色和不透明度:
public class SolidColorBrushComparer : IEqualityComparer<SolidColorBrush>
{
public bool Equals(SolidColorBrush x, SolidColorBrush y)
{
return x.Color == y.Color &&
x.Opacity == y.Opacity;
}
public int GetHashCode(SolidColorBrush obj)
{
return new { C = obj.Color, O = obj.Opacity }.GetHashCode();
}
}
然后比较您只需执行以下操作:
SolidColorBrush otherBrush = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFEFEEEE"));
SolidColorBrush backgroundBrush = (SolidColorBrush)grd.Background;
if(new SolidColorBrushComparer().Equals(backgroundBrush, otherBrush))
{
// They're equal, Yay!
}
我对猫进行了如下剥皮,将十六进制值与字符串进行了比较:
if (MyBrush.ToString() == Brushes.Transparent.ToString())
MyBrush = Brushes.Magenta;
除了前面提到的那些之外,我被迫寻找另一种方法,因为我在另一个有一些限制的框架中使用 C#(例如 .Color
属性 对我不可用)。
我正在尝试比较 2 支画笔,如您在图片中所见。我不知道为什么它会失败...
DependencyObject
派生的 类 只会相等 (.Equals() == true
)。仅当使用了实际的相同对象时才会出现这种情况,或者 BrushConverter.ConvertFrom
返回 SolidColorBrush
的相同实例。这种情况不太可能,只是一种假设。
喜欢评论已经提到:尝试比较Color
and/or 纯色画笔的其他属性。 Color
是一个实现 IEquatable<Color>
的结构,将产生正确的行为。
来源:
它们不会相等,因为它正在进行引用比较并且它们是堆中具有相同属性的两个不同引用。
如果你想控制对象比较,你应该实现IEqualtable
接口。然后你可以说出必须如何比较对象。然而,在这种情况下,由于 SolidColorBrush
是 .NET class,我们无法实现 IEquatable
。有不同的选择
1) 在 SolidColorBrush
上使用扩展方法,将画笔实例与另一个进行比较。不过在这种情况下不是一个很好的解决方案。
2) 最好的办法可能是使用 IEqualityComparer
界面。您创建一个单独的 class 实现 IEqualityComparer
,它将定义如何比较 2 个不同的对象。例如,在您的示例中,您可能想要比较 SolidColorBrush 的颜色和不透明度:
public class SolidColorBrushComparer : IEqualityComparer<SolidColorBrush>
{
public bool Equals(SolidColorBrush x, SolidColorBrush y)
{
return x.Color == y.Color &&
x.Opacity == y.Opacity;
}
public int GetHashCode(SolidColorBrush obj)
{
return new { C = obj.Color, O = obj.Opacity }.GetHashCode();
}
}
然后比较您只需执行以下操作:
SolidColorBrush otherBrush = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFEFEEEE"));
SolidColorBrush backgroundBrush = (SolidColorBrush)grd.Background;
if(new SolidColorBrushComparer().Equals(backgroundBrush, otherBrush))
{
// They're equal, Yay!
}
我对猫进行了如下剥皮,将十六进制值与字符串进行了比较:
if (MyBrush.ToString() == Brushes.Transparent.ToString())
MyBrush = Brushes.Magenta;
除了前面提到的那些之外,我被迫寻找另一种方法,因为我在另一个有一些限制的框架中使用 C#(例如 .Color
属性 对我不可用)。