Автоматическое применение стилей
92WPF --- Привязка, команды и стили WPF --- Автоматическое применение стилей
До сих пор было показано, как создавать именованные стили и ссылаться на них в коде разметки. Однако существует и другой подход. Стиль можно применять автоматически к элементам определенного типа.
Реализуется это довольно просто. Все, что понадобится — это установить свойство TargetType так, чтобы оно указывало на подходящий тип (как описывалось ранее), и не использовать имя ключа. В этом случае WPF устанавливает имя ключа неявно с использованием расширения разметки Type:
х:Кеу="{х:Type Button}"
Теперь стиль автоматически применяется ко всем кнопкам, расположенным ниже в дереве элементов. Например, если определить стиль подобным образом для окна, он будет применяться к каждой кнопке в этом окне (при условии отсутствия далее в коде другого стиля, заменяющего его).
Ниже показан пример с окном, в котором стили кнопок устанавливаются автоматически для получения такого же эффекта, как в предыдущей статье:
<Style TargetType="Button">
<Setter Property="Control.FontFamily" Value="Calibri"></Setter>
<Setter Property="Control.FontSize" Value="18"></Setter>
<Setter Property="Control.FontWeight" Value="Bold"></Setter>
<Setter Property="Control.Padding" Value="5"></Setter>
<Setter Property="Control.Margin" Value="5"></Setter>
</Style>
Несмотря на удобство, автоматически применяемые стили усложняют решение. Ниже перечислено несколько возможных причин:
В сложном окне с множеством стилей и уровней стилей становится трудно отслеживать то, устанавливается данное свойство посредством наследования значений свойств или с помощью стиля (и какого именно). В результате изменение даже простой детали может потребовать просмотра разметки всего окна.
Форматирование в окне часто сначала является более общим, а потом постепенно усложняется. Если автоматические стили применялись на раннем этапе, скорее всего, их потребуется переопределять во многих местах с помощью явных стилей. Это значительно усложняет решение в целом. Гoраздо проще создавать именованные стили для каждой комбинации желаемых характеристик форматирования и применять их по имени.
В случае создания автоматического стиля, например, для элемента TextBlock, обязательно потребуется модифицировать другие элементы управления, которые используют TextBlock (такие как управляемый шаблоном элемент ListBox).
Во избежание подобных проблем лучше всего применять автоматические стили рассудительно. Если решено использовать автоматические стили для придания всему пользовательскому интерфейсу единого согласованного вида, старайтесь ограничить применение явно устанавливаемых стилей только особыми случаями.