Еще один эффект от атрибута TargetType
заключается в том, что стиль будет применен ко всем элементам данного типа внутри области определения стиля при условии, что свойство х:Key
Вот еще один стиль уровня приложения, который будет автоматически применяться ко всем элементам управления TextBox
в текущем приложении:
Теперь можно определять любое количество элементов управления TextBox
, и все они автоматически получат установленный внешний вид. Если какому-то элементу управления TextBox
не нужен такой стандартный внешний вид, тогда он может отказаться от него, установив свойство StyleB {x:Null}
. Например, элемент txtTest
будет иметь неименованный стандартный стиль, а элемент txtTest2
сделает все самостоятельно:
BorderThickness="5" Height="60" Width="100" Text="Ha!"/>
Создание подклассов существующих стилей
Новые стили можно также строить на основе существующего стиля посредством свойства BasedOn
. Расширяемый стиль должен иметь подходящий атрибут х:Кеу
в словаре, т.к. производный стиль будет ссылаться на него по имени, используя расширение разметки {StaticResource}
или {DynamicResource}
. Ниже представлен новый стиль, основанный на стиле BigGreenButton
, который поворачивает элемент управления Button
на 20 градусов:
BasedOn="{StaticResource BigGreenButton}">
Чтобы применить новый стиль, модифицируйте разметку для кнопки следующим образом:
Style="{StaticResource TiltButton}" Width="250" Cursor="Help"/>
Такое действие изменяет внешний вид изображения, как показано на рис. 27.8.
Определение стилей с триггерами
Стили WPF могут также содержать триггеры за счет упаковки объектов Trigger
в коллекцию Triggers
объекта Style
. Использование триггеров в стиле позволяет определять некоторые элементы Setter
таким образом, что они будут применяться только в случае истинности заданного условия триггера. Например, возможно требуется увеличивать размер шрифта, когда курсор мыши находится над кнопкой. Или, скажем, нужно подсветить текстовое поле, имеющее фокус, с использованием фона указанного цвета. Триггеры полезны в ситуациях подобного рода, потому что они позволяют предпринимать специфические действия при изменении свойства, не требуя написания явной логики С# в файле отделенного кода.
Далее приведена модифицированная разметка для стиля элементов управления типа TextBox
, где обеспечивается установка фона желтого цвета, когда элемент TextBox
получает фокус:
При тестировании этого стиля вы обнаружите, что по мере перехода с помощью клавиши <ТаЬ> между элементами TextBox
текущий выбранный TextBox
получает фон желтого цвета (если только стиль не отключен путем присваивания {x:Null}
свойству Style
).
Триггеры свойств также весьма интеллектуальны в том смысле, что когда условие триггера TextBox
теряет фокус, он также автоматически принимает стандартный цвет без какой-либо работы с вашей стороны. По контрасту с ними триггеры событий (которые исследовались при рассмотрении анимации WPF) не возвращаются автоматически в предыдущее состояние.
Определение стилей с множеством триггеров
Триггеры могут быть спроектированы так, что определенные элементы Setter
будут применяться, когда истинными должны оказаться TextBox
в Yellow
только в случае, если он имеет активный фокус и курсор мыши находится внутри его границ. Для этого можно воспользоваться элементом MultiTriggern
определить в нем каждое условие:
Стили с анимацией
Стили также могут содержать в себе триггеры, которые запускают анимационную последовательность. Ниже показан последний стиль, который после применения к элементам управления Button
заставит их увеличиваться и уменьшаться в размерах, когда курсор мыши находится внутри границ кнопки:
Duration="0:0:2" AutoReverse="True"/>
Здесь коллекция Triggers
наблюдает за тем, когда свойство IsMouseOver
возвратит значение true
. После того как это произойдет, определяется элемент Trigger.EnterActions
для выполнения простой раскадровки, которая заставляет кнопку за две секунды увеличиться до значения Height
, равного 200
(и затем возвратиться к значению Height
, равному 40
). Чтобы отслеживать другие изменения свойств, можно также добавить область Trigger.ExitActions
и определить в ней любые специальные действия, которые должны быть выполнены, когда IsMouseOver
изменяется на false
.
Применение стилей в коде