Поиск…
замечания
Вводные замечания
В WPF стиль определяет значения одного или нескольких свойств зависимостей для данного визуального элемента. Стили используются во всем приложении, чтобы сделать пользовательский интерфейс более согласованным (например, чтобы все диалоговые кнопки были согласованного размера) и облегчить массовые изменения (например, изменение ширины всех кнопок).
Стили обычно определяются в ResourceDictionary
на высоком уровне в приложении (например, в App.xaml или в теме), поэтому он доступен для приложения, но они также могут быть определены для одного элемента и его дочерних элементов, например, для применения стиль для всех элементов TextBlock
внутри StackPanel
.
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="5,5,5,0"/>
<Setter Property="Background" Value="#FFF0F0F0"/>
<Setter Property="Padding" Value="5"/>
</Style>
</StackPanel.Resources>
<TextBlock Text="First Child"/>
<TextBlock Text="Second Child"/>
<TextBlock Text="Third Child"/>
</StackPanel>
Важные заметки
- Место, где определяется стиль, влияет на его доступность.
- Прямые ссылки не могут быть решены с помощью
StaticResource
. Другими словами, если вы определяете стиль, который зависит от другого стиля или ресурса в ресурсном словаре, он должен быть определен после / ниже ресурса, от которого он зависит. -
StaticResource
- это рекомендуемый способ ссылки на стили и другие ресурсы (по производительности и поведенческим причинам), если только вам не требуется использованиеDynamicResource
, например, для тем, которые можно изменить во время выполнения.
Ресурсы
MSDN содержит подробные статьи о стилях и ресурсах, которые имеют большую глубину, чем это возможно здесь.
Определение названного стиля
Именованный стиль требует наличия свойства x:Key
и применяется только к элементам, которые явно ссылаются на него по имени:
<StackPanel>
<StackPanel.Resources>
<Style x:Key="MyTextBlockStyle" TargetType="TextBlock">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="FontWeight" Value="Bold"/>
</Style>
</StackPanel.Resources>
<TextBlock Text="Yellow and bold!" Style="{StaticResource MyTextBlockStyle}" />
<TextBlock Text="Also yellow and bold!" Style="{DynamicResource MyTextBlockStyle}" />
<TextBlock Text="Plain text." />
</StackPanel>
Определение неявного стиля
Неявный стиль применяется ко всем элементам данного типа в пределах области видимости. Неявный стиль может опустить x:Key
поскольку он неявно совпадает с свойством TargetType
стиля.
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="FontWeight" Value="Bold"/>
</Style>
</StackPanel.Resources>
<TextBlock Text="Yellow and bold!" />
<TextBlock Text="Also yellow and bold!" />
<TextBlock Style="{x:Null}" Text="I'm not yellow or bold; I'm the control's default style!" />
</StackPanel>
Наследование от стиля
Обычно требуется базовый стиль, который определяет свойства / значения, разделяемые между несколькими стилями, принадлежащими одному и тому же TextBlock
управления, особенно для чего-то вроде TextBlock
. Это достигается с помощью свойства BasedOn
. Значения наследуются, а затем могут быть переопределены.
<Style x:Key="BaseTextBlockStyle" TargetType="TextBlock">
<Setter Property="FontSize" Value="12"/>
<Setter Property="Foreground" Value="#FFBBBBBB" />
<Setter Property="FontFamily" Value="Arial" />
</Style>
<Style x:Key="WarningTextBlockStyle"
TargetType="TextBlock"
BasedOn="{StaticResource BaseTextBlockStyle">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="FontWeight" Value="Bold" />
</Style>
В приведенном выше примере любой TextBlock
с использованием стиля WarningTextBlockStyle
будет представлен как 12px Arial в красном и полужирном.
Поскольку неявные стили имеют неявный x:Key
, соответствующий их TargetType
, вы также можете наследовать их:
<!-- Implicit -->
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="12"/>
<Setter Property="Foreground" Value="#FFBBBBBB" />
<Setter Property="FontFamily" Value="Arial" />
</Style>
<Style x:Key="WarningTextBlockStyle"
TargetType="TextBlock"
BasedOn="{StaticResource {x:Type TextBlock}}">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="FontWeight" Value="Bold" />
</Style>