Вы должны определить Style
для каждого элемента управления. Это связано с тем, что визуальные элементы и визуальные состояния определяются внутренним ControlTemplate
каждого элемента управления.
Но вы можете значительно сократить объем работы, повторно используя шаблоны и каскадные стили.
Чтобы разрешить Простая цветовая тематика и централизованная настройка, вы должны создать ресурс, который определяет все соответствующие цвета вашей темы:
ColorResources.xaml
<ResourceDictionary>
<!-- Colors -->
<Color x:Key="HighlightColor">DarkOrange</Color>
<Color x:Key="DefaultControlColor">LightSeaGreen</Color>
<Color x:Key="ControlDisabledTextColor">Gray</Color>
<Color x:Key="BorderColor">DarkGray</Color>
<Color x:Key="MouseOverColor">LightSteelBlue</Color>
<!-- Brushes -->
<SolidColorBrush x:Key="HighlightBrush" Color="{StaticResource HighlightColor}" />
<SolidColorBrush x:Key="ControlDisabledTextBrush" Color="{StaticResource ControlDisabledColor}" />
<SolidColorBrush x:Key="BorderBrush" Color="{StaticResource BorderColor}" />
<SolidColorBrush x:Key="MouseOverBrush" Color="{StaticResource MouseOverColor}" />
</ResourceDictionary>
Вы можете добавить следующее стилизует шаблоны в файл App.xaml :
App.xaml
<Application>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/File/Path/To/ColorResources.xaml" />
</ResourceDictionary.MergedDictionaries>
...
</ResourceDictionary>
</Application.Resources>
</Application>
Чтобы переопределить цвет выбранной строки в GridView
или DataGrid
вам просто нужно переопределить bru по умолчанию sh SystemColors.HighlightBrush
, используемый этими элементами управления:
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
Color="{StaticResource HighlightColor}" />
Чтобы переопределить цвет по умолчанию для элементов управления, таких как заголовки столбцов, например, DatGrid
вам просто нужно отменить стандартное bru sh SystemColors.ControlBrush
, используемое этими элементами управления:
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
Color="{StaticResource DefaultControlColor}" />
Для простых ContentControls
таких как Button
или ListBoxItem
вы можете использовать общий ControlTemplate
. Этот общий ControlTemplate
гармонизирует визуальные состояния:
<ControlTemplate x:Key="BaseContentControlTemplate"
TargetType="ContentControl">
<Border BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}">
<ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{StaticResource ControlDisabledTextBrush}" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="0.7" />
<Setter Property="Background" Value="{StaticResource MouseOverBrush}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
Этот базовый шаблон будет применяться с использованием базовых стилей. Это позволяет выполнять простую цепочку (наследование стилей) и повторно использовать BaseContentControlTemplate
для различных элементов управления, таких как Button
или ListBoxItem
:
<Style x:Key="BaseContentControlStyle"
TargetType="ContentControl">
<Setter Property="Template" Value="{StaticResource BaseContentControlTemplate}" />
</Style>
Некоторым ContentControl
, таким как Button
, могут потребоваться дополнительные состояния, например Pressed
. Вы можете расширить дополнительные базовые c визуальные состояния, создав базовый стиль, который, например, имеет целью ButtonBase
и может использоваться с любым элементом управления, производным от ButtonBase
:
<Style x:Key="BaseButtonStyle"
TargetType="ButtonBase"
BasedOn="{StaticResource BaseContentControlStyle}">
<Style.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="{StaticResource HighlightBrush}" />
</Trigger>
</Style.Triggers>
</Style>
Чтобы применить эти базовые стили вы должны явно указать элементы управления. Вы используете эти стили для добавления дополнительных c визуальных состояний или макета, например, ListBoxItem.IsSelcted
, ToggleButton.IsChecked
или DataGridColumnHeader
:
<!-- Buttons -->
<Style TargetType="Button" BasedOn="{StaticResource BaseButtonStyle}" />
<Style TargetType="ToggleButton" BasedOn="{StaticResource BaseButtonStyle}">
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="{StaticResource HighlightBrush}" />
</Trigger>
</Style.Triggers>
</Style>
<!- ListBox -->
<Style TargetType="ListBoxItem" BasedOn="{StaticResource BaseContentControlStyle}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{StaticResource HighlightBrush}" />
</Trigger>
</Style.Triggers>
</Style>
<!-- ListView -->
<Style TargetType="ListViewItem" BasedOn="{StaticResource {x:Type ListBoxItem}}" />
<!--
GridView
Since GridViewColumnHeader is also a ButtonBase we can extend existing style
-->
<Style TargetType="GridViewColumnHeader" BasedOn="{StaticResource BaseButtonStyle}" />
<Style x:Key="BaseGridViewStyle" TargetType="ListViewItem">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{StaticResource HighlightBrush}" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}" />
</Trigger>
</Style.Triggers>
</Style>
<!--
DataGrid
Since DataGridColumnHeader is also a ButtonBase we can extend existing style
-->
<Style TargetType="DataGridColumnHeader"
BasedOn="{StaticResource BaseButtonStyle}">
<Setter Property="BorderThickness" Value="1,0" />
<Setter Property="BorderBrush" Value="{StaticResource BorderBrush}" />
</Style>
Другие более сложные составные элементы управления, такие как ComboBox
, TreeView
или MenuItem
требуют индивидуального переопределения шаблона элемента управления. Поскольку эти элементы управления состоят из других элементов управления, вам обычно необходимо переопределить стили и для этих элементов управления. Например, ComboBox
состоит из TextBox
, ToggleButton
и Popup
.
Их стили можно найти в Microsoft Docs: Control Styles and Templates .
Это очень простой и базовый c способ добавить темы в ваше приложение. Знание дерева наследования элементов управления помогает создавать повторно используемые базовые стили. Повторное использование стилей помогает сократить усилия по нацеливанию и настройке каждого элемента управления.
Наличие всех визуальных ресурсов, таких как цвета или значки, определенных в одном месте, позволяет легко изменять их без необходимости знать / изменять каждый элемент управления по отдельности.