Создание объекта стиля
98WPF --- Привязка, команды и стили WPF --- Создание объекта стиля
Система стилей привносит массу преимуществ. Она не только позволяет создавать группы параметров, явно связанных между собой, но также упрощает код разметки, тем самым облегчая применение этих параметров. Лучше всего то, что стиль можно применять, не беспокоясь о том, какие свойства он устанавливает.
Коллекция Setters является самым важным свойством класса Style. Вообще существует пять ключевых свойств, которые кратко описаны ниже.
- Setters
Коллекция объектов Setter или EventSetter, которые устанавливают значения для свойств и присоединяют обработчики событий автоматически
- Triggers
Коллекция объектов, унаследованных от класса TriggerBase, которые позволяют автоматически изменять настройки стиля. Настройки стиля могут модифицироваться, например, при изменении значения какого-то другого свойства или при поступлении какого-нибудь события
- Resources
Коллекция ресурсов, которые должны использоваться со стилями. Например, может понадобиться использовать единственный объект для установки нескольких свойств. В таком случае более эффективно создать объект как ресурс и затем использовать этот ресурс в объекте Setter (вместо создания этого объекта в виде части каждого Setter с применением вложенных дескрипторов)
- BasedOn
Свойство, которое позволяет создавать более специализированный стиль, наследующий (и дополнительно переопределяющий) параметры другого стиля
- TargetType
Свойство, которое идентифицирует тип элемента, к которому применяется данный стиль. Это свойство позволяет создавать объекты Setter, влияющие только на определенные элементы, а также объекты Setter, автоматически вступающие в силу для всех элементов подходящего типа
Рассмотрев простой пример стиля в действии, можно переходить к более глубокому изучению модели стилей.
В примере из предыдущей статьи объект стиля определялся на уровне окна и затем повторно использовался в двух кнопках внутри этого окна. Хотя такое решение встречается довольно часто, единственно возможным вариантом оно, естественно, не является.
Более точно направленные стили можно определять с использованием коллекции Resources их контейнера, такого как StackPanel или Grid. Чтобы многократно использовать стили по всему приложению, их можно определять с применением коллекции Resources приложения. Эти два подхода тоже являются общими.
Строго говоря, применять стили и ресурсы вместе вовсе необязательно. Например, стиль определенной кнопки можно определить, заполнив ее коллекцию Style напрямую, как показано ниже:
<Button>
<Button.Style>
<Style>
<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>
</Button.Style>
<Button.Content>Обычная кнопка</Button.Content>
</Button>
Это работает, но очевидно является гораздо менее полезным, потому что лишает возможности разделения данного стиля с другими элементами.
Такой подход не стоит потраченных усилий в случае, если стиль используется просто для установки определенных свойств (как в этом примере), поскольку гораздо проще устанавливать эти свойства напрямую. Иногда он оказывается полезным, скажем, когда нужно, чтобы другое средство стилей применялось только к единственному элементу.
Например, этот подход можно использовать для присоединения триггеров к элементу. Также он позволяет модифицировать часть шаблона элемента управления. (В таком случае используется свойство Setter.TargetName для применения объекта Setter к конкретному компоненту внутри элемента, такому как кнопки полосы прокрутки в окне списка.)