<Setter Property="Height" Value="100"/>
<Setter Property="Width" Value="100"/>
<Setter Property="Background" Value="DarkGreen"/>
<Setter Property="Foreground" Value="Yellow"/>
</Style>
Такой стиль будет работать только с элементами управления Button (или подклассами Button). Если применить его к несовместимому элементу, тогда возникнут ошибки разметки и компиляции. Добавьте элемент управления Button, который использует новый стиль:
<Button x:Name="btnAnotherButton" Content="OK!" Margin="0,10,0,0"
Style="{StaticResource BigGreenButton}" Width="250" Cursor="Help"/>
Результирующий вывод представлен на рис. 27.7.
Еще один эффект от атрибута TargetType заключается в том, что стиль будет применен ко всем элементам данного типа внутри области определения стиля при условии, что свойство х:Key отсутствует.
Вот еще один стиль уровня приложения, который будет автоматически применяться ко всем элементам управления TextBox в текущем приложении:
<b><!-- Стандартный стиль для всех текстовых полей --></b>
<Style TargetType="TextBox">
<Setter Property="FontSize" Value="14"/>
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="30"/>
<Setter Property="BorderThickness" Value="5"/>
<Setter Property="BorderBrush" Value="Red"/>
<Setter Property="FontStyle" Value="Italic"/>
</Style>
Теперь можно определять любое количество элементов управления TextBox, и все они автоматически получат установленный внешний вид. Если какому-то элементу управления TextBox не нужен такой стандартный внешний вид, тогда он может отказаться от него, установив свойство StyleB {x:Null}. Например, элемент txtTest будет иметь неименованный стандартный стиль, а элемент txtTest2 сделает все самостоятельно:
<TextBox x:Name="txtTest"/>
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})
<TextBox x:Name="txtTest2" Style="{x:Null}" BorderBrush="Black"
BorderThickness="5" Height="60" Width="100" Text="Ha!"/>
Создание подклассов существующих стилей
Новые стили можно также строить на основе существующего стиля посредством свойства BasedOn. Расширяемый стиль должен иметь подходящий атрибут х:Кеу в словаре, т.к. производный стиль будет ссылаться на него по имени, используя расширение разметки {StaticResource} или {DynamicResource}. Ниже представлен новый стиль, основанный на стиле BigGreenButton, который поворачивает элемент управления Button на 20 градусов:
<b><!-- Этот стиль основан на BigGreenButton --></b>
<Style x:Key="TiltButton" TargetType="Button"
BasedOn="{StaticResource BigGreenButton}">
<Setter Property="Foreground" Value="White"/>
<Setter Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="20"/>
</Setter.Value>
</Setter>
</Style>
Чтобы применить новый стиль, модифицируйте разметку для кнопки следующим образом:
<Button x:Name="btnAnotherButton" Content="OK!" Margin="0,10,0,0"
Style="{StaticResource TiltButton}" Width="250" Cursor="Help"/>
Такое действие изменяет внешний вид изображения, как показано на рис. 27.8.
Определение стилей с триггерами
Стили WPF могут также содержать триггеры за счет упаковки объектов Trigger в коллекцию Triggers объекта Style. Использование триггеров в стиле позволяет определять некоторые элементы Setter таким образом, что они будут применяться только в случае истинности заданного условия триггера. Например, возможно требуется увеличивать размер шрифта, когда курсор мыши находится над кнопкой. Или, скажем, нужно подсветить текстовое поле, имеющее фокус, с использованием фона указанного цвета. Триггеры полезны в ситуациях подобного рода, потому что они позволяют предпринимать специфические действия при изменении свойства, не требуя написания явной логики С# в файле отделенного кода.
Далее приведена модифицированная разметка для стиля элементов управления типа TextBox, где обеспечивается установка фона желтого цвета, когда элемент TextBox получает фокус: