Как определить, реализует ли объект зависимости заданное свойство зависимости (C# / WPF)

Я работаю с классами в System.Windows.Documents namespace, пытаясь написать некоторый универсальный код, который будет условно устанавливать значение определенных свойств зависимостей, в зависимости от того, существуют ли эти свойства в данном классе.

Например, следующий метод присваивает произвольное значение Padding свойство переданного FrameworkContentElement:

void SetElementPadding(FrameworkContentElement element)
{
    element.SetValue(Block.PaddingProperty, new Thickness(155d));
}

Однако не все конкретные реализации FrameworkContentElement иметь Padding имущество (Paragraph но делает Span нет), поэтому я ожидаю, что присвоение свойства будет успешным для типов, которые реализуют это свойство, и будет игнорироваться для типов, которые этого не делают.

Но, похоже, что вышеупомянутое присваивание свойства успешно для экземпляров всех производных FrameworkContentElementнезависимо от того, реализуют ли они Padding имущество. Я делаю это предположение, потому что я всегда мог прочитать заданное значение.

Я предполагаю, что в назначении значений свойств есть некоторый недостаток. Что я должен сделать, чтобы гарантировать, что данное назначение свойства зависимости игнорируется классами, которые не реализуют это свойство?

Большое спасибо за ваш совет.

Тим

1 ответ

Решение

Все классы, производные от Block, имеют свойство Padding. Вы можете использовать следующую модификацию:

void SetElementPadding(FrameworkContentElement element)
{
    var block = element as Block;
    if (block == null) return;

    block.Padding = new Thickness(155d);
}

Даже без этой модификации все будет работать для вас, потому что все, что вы хотите, это чтобы Padding игнорировался классами, которые его не поддерживают. Это именно то, что случилось бы. Тот факт, что вы можете считывать значение свойства зависимостей Padding для экземпляра, который его не поддерживает, вероятно, является задуманностью, но вам не следует об этом беспокоиться. Блок и производные будут уважать ценность, а все остальные будут игнорировать ее.

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