Глобальное изменение цвета всех элементов управления при наведении указателя мыши WPF - PullRequest
0 голосов
/ 28 мая 2020

Кнопки, заголовки столбцов, поля со списком и т. Д. c. все go приятный синий цвет Microsoft, когда вы наводите на них курсор.

Я бы предпочел, чтобы они были красивого оттенка моего корпоративного зеленого.

Screenshot

Есть ли способ изменить этот цвет глобально для моего приложения или окна.

Если это не получится, придется ли мне менять этот цвет для каждого отдельного типа элемента управления?

Ответы [ 2 ]

1 голос
/ 07 июня 2020

Вы должны определить 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 способ добавить темы в ваше приложение. Знание дерева наследования элементов управления помогает создавать повторно используемые базовые стили. Повторное использование стилей помогает сократить усилия по нацеливанию и настройке каждого элемента управления.
Наличие всех визуальных ресурсов, таких как цвета или значки, определенных в одном месте, позволяет легко изменять их без необходимости знать / изменять каждый элемент управления по отдельности.

0 голосов
/ 03 июня 2020

Если вы посмотрите на стили по умолчанию (https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/button-styles-and-templates), вы обнаружите, что каждый стиль использует static resources для объявления цветов. Таким образом, чтобы реализовать свой проект, вам придется перезаписать эти static resources, где хранятся цвета.

К сожалению, это невозможно в WPF (ранее уже спрашивалось: Переопределить ресурс stati c в WPF ).

Таким образом, ваше единственное решение - написать отдельный Style для каждого элемента управления и повторно объявить цвета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...