Как заставить пользовательский элемент управления следовать текущей теме/стилю в WPF?

Я пытаюсь использовать: Modern UI for WPF и Расширенный набор инструментов WPF, точнее IntegerUpDown, и проблема в том, что IntegerUpDown не соответствует выбранной теме ModernUI. Стало яснее, когда мы изменили его на темную тему, IntegerUpDown остается с белым фоном.

Во-первых, я пробую что-то вроде...

<Style TargetType="{x:Type local:IntegerUpDown}" BasedOn="{StaticResource {x:Type TextBox}}" />

... но во время выполнения я получаю исключение Может основываться только на стиле с целевым типом, который является базовым типом «IntegerUpDown». Я понимаю это, в конце концов, IntegerUpDown — это составной элемент управления, а не производный напрямую из текстового поля...

Итак, я не знаю, как мне быть. В своем исследовании я обнаружил, что файлы, которые могут иметь значение:

НО я не эксперт XAML, чтобы связать 2 информации, чтобы получить решение ИЛИ, если есть другое простое решение, которое я не вижу...

Спасибо за любую помощь.


person Click Ok    schedule 25.06.2016    source источник


Ответы (1)


Как вы заметили, при работе с пользовательскими элементами управления вам часто потребуется выполнить некоторые пользовательские стили, чтобы перенастроить макет. Все зависит от того, как далеко вы хотите зайти, но чтобы дать вам представление, я считаю, что рабочий процесс ниже должен исправить цвет фона.

Цвет фона привязан к темам ресурсов Xceed, фрагмент из Инструментарий Wpf:

<Style x:Key="NumericUpDown" TargetType="{x:Type prim:InputBase}">
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}" />
        <Setter Property="Background" Value="{DynamicResource {x:Static themes:ResourceKeys.ControlNormalBackgroundKey}}" />
        <Setter Property="BorderBrush" Value="{DynamicResource {x:Static themes:ResourceKeys.ControlNormalBorderKey}}" />
</Style>

Стиль ModernUI (в соответствии с выбранной темой) для этих свойств выглядит следующим образом, например. текстовое поле ModernUI:

<Style TargetType="{x:Type TextBoxBase}">
        <Setter Property="Foreground" Value="{DynamicResource InputText}"/>
        <Setter Property="Background" Value="{DynamicResource InputBackground}"/>
        <Setter Property="BorderBrush" Value="{DynamicResource InputBorder}"/>
</Style>

Динамические ресурсы находятся в файле темы, например ModernUI.Dark.xaml

<SolidColorBrush x:Key="InputText" Color="#d1d1d1" />

<SolidColorBrush x:Key="InputBackground" Color="#333333" />
<SolidColorBrush x:Key="InputBackgroundHover" Color="#3e3e42" />
<SolidColorBrush x:Key="InputBorder" Color="#333333" />

Теперь вы можете жестко закодировать их в своем стиле, зафиксировав их на 1 теме.

<Style TargetType="{x:Type local:IntegerUpDown}">
      <Setter Property="Foreground" Value="#d1d1d1" />
      <Setter Property="Background" Value="#333333" />
      <Setter Property="BorderBrush" Value="#333333" />
</Style>

Для расширенного стиля вам потребуется больше работы, например это сообщение посвящено изменению стиля водяного знака.

person Funk    schedule 26.06.2016