Язык программирования C#9 и платформа .NET5
<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"/><TextBox x:Name="txtTest2" Style="{x:Null}" BorderBrush="Black"BorderThickness="5" Height="60" Width="100" Text="Ha!"/>Создание подклассов существующих стилей
Новые стили можно также строить на основе существующего стиля посредством свойства
. Расширяемый стиль должен иметь подходящий атрибутBasedOnв словаре, т.к. производный стиль будет ссылаться на него по имени, используя расширение разметких:Кеуили{StaticResource}. Ниже представлен новый стиль, основанный на стиле{DynamicResource}, который поворачивает элемент управленияBigGreenButtonна 20 градусов:Button<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

