Как сравнить SolidColorBrushes?

Я пытаюсь сравнить 2 кисти, как вы можете видеть на картинке. Я понятия не имею, почему это терпит неудачу...

Equal Fail

3 ответа

Решение

Они не будут равны, потому что это делает сравнение ссылок, и они две разные ссылки в куче с одинаковыми свойствами.

Если вы хотите контролировать сравнения объектов, вы должны реализовать 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!
}

Классы, полученные из DependencyObject будет только равным (.Equals() == true) если объект имеет ту же ссылку (перегрузка не включена). Это может иметь место только в том случае, если использовался фактический объект, или BrushConverter.ConvertFrom возвращал те же экземпляры SolidColorBrush, Этот случай маловероятен и будет предположением.

Как уже упоминалось комментарии: попробуйте сравнить Color и / или другие свойства кисти сплошного цвета. Color это структура, которая реализует IEquatable<Color> и приведет к правильному поведению.

Источники:

Я скинул кошку следующим образом, сравнив шестнадцатеричные значения в виде строк:

      if (MyBrush.ToString() == Brushes.Transparent.ToString())
    MyBrush = Brushes.Magenta;

Я был вынужден найти другой способ, помимо упомянутых ранее, потому что я использую C# в другой среде, которая имеет некоторые ограничения (например, .Colorимущество мне недоступно).

Другие вопросы по тегам