Как сравнить SolidColorBrushes?
Я пытаюсь сравнить 2 кисти, как вы можете видеть на картинке. Я понятия не имею, почему это терпит неудачу...
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
имущество мне недоступно).