如何比较SolidColorBrushes?

时间:2015-01-23 07:54:12

标签: c# wpf

我正在尝试比较2个画笔,如图所示。我不知道为什么失败......

Equal Fail

2 个答案:

答案 0 :(得分:4)

它们不相等,因为它正在进行参考比较,它们是堆中具有相同属性的两个不同引用。

如果要控制对象比较,则应实现IEqualtable接口。然后,您可以说明必须如何比较对象。但是,在这种情况下,由于SolidColorBrush是.NET类,我们无法实现IEquatable。有不同的选择

1)在SolidColorBrush上使用扩展方法,将刷子实例与另一个实例进行比较。在这种情况下,这不是一个很好的解决方案。

2)最好的选择是使用IEqualityComparer界面。您创建了一个实现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!
}

答案 1 :(得分:2)

如果对象具有相同的引用(不包括重载),则从DependencyObject派生的类将仅相等(.Equals() == true)。只有在使用实际相同的对象或BrushConverter.ConvertFrom返回SolidColorBrush的相同实例时才会出现这种情况。这种情况不太可能,而且是一种假设。

与已经提到的评论一样:尝试比较纯色画笔的Color和/或其他属性。 Color是一个实现IEquatable<Color>的结构,将导致正确的行为。

来源: