Как определить, реализует ли объект зависимости заданное свойство зависимости (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 для экземпляра, который его не поддерживает, вероятно, является задуманностью, но вам не следует об этом беспокоиться. Блок и производные будут уважать ценность, а все остальные будут игнорировать ее.