Могу ли я получить WPF ListBox для наследования кистей от родительского элемента? - PullRequest
3 голосов
/ 12 марта 2010

Моему окну WPF настроена кисть переднего плана на кисть из словаря ресурсов, и я хочу, чтобы весь текст в окне имел этот цвет, поэтому я больше не касаюсь кисти переднего плана.

Текстовые поля получают цвет
Текстовые блоки получают цвет
Кнопки приобретают цвет

Списки не получают цвет, как и их содержимое.

Есть ли способ заставить Listbox вести себя как другие элементы управления в этом отношении?

Предполагая, что нет, и что это умышленно, каково обоснование?

Edit:

Кажется, мой вопрос недостаточно ясен.

Я понимаю, как создавать стили и ресурсы и применять их к ListBox es; Мне интересно, почему мне нужно сделать это для определенных элементов управления, когда я не нужен для других - почему некоторые наследуют свойства, а другие нет - и есть ли способ заставить их все наследовать таким же образом.

Ответы [ 3 ]

8 голосов
/ 26 марта 2010

Причина, по которой ListBox и некоторые другие элементы управления не наследуют свойство Foreground, заключается в том, что оно явно переопределяется с помощью Setter в стиле по умолчанию. К сожалению, даже если вы назначите пользовательский стиль для ListBox, который не включает в себя установщик свойства Foreground, он все равно будет использовать стиль по умолчанию, прежде чем пытаться наследовать значение своего родителя.

Порядок приоритета для определения значения свойства:

  1. Местное значение
  2. Стиль триггеров
  3. Шаблон триггеров
  4. Стиль сеттеров
  5. Триггеры в стиле темы
  6. Настройки стиля темы
  7. Значение свойства наследования
  8. Значение по умолчанию

Поскольку # 6 определен в стиле по умолчанию для элемента управления, WPF не пытается определить значение # 7.

1 голос
/ 14 марта 2010

Вы можете сделать что-то вроде этого:

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="root">
    <ListBox>
        <ListBox.Resources>
            <Style TargetType="{x:Type ListBox}">
                <Style.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Yellow"/>
                    <SolidColorBrush x:Key="{x:Static SystemColors.WindowTextBrushKey}" Color="Red"/>
                </Style.Resources>
            </Style>
        </ListBox.Resources>
        <ListBoxItem>Item 1</ListBoxItem>
        <ListBoxItem>Item 2</ListBoxItem>
    </ListBox>
</Page>

Вместо Color="Red" вы можете использовать выражение Binding для привязки к ресурсу цвета, определенному для вашего приложения.

1 голос
/ 12 марта 2010

вот стиль для элементов списка:

<Style x:Key="{x:Type ListBoxItem}" TargetType="ListBoxItem">
  <Setter Property="SnapsToDevicePixels" Value="true"/>
  <Setter Property="OverridesDefaultStyle" Value="true"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="ListBoxItem">
        <Border 
          Name="Border"
          Padding="2"
          SnapsToDevicePixels="true">
          <ContentPresenter />
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsSelected" Value="true">
            <Setter TargetName="Border" Property="Background"
                    Value="{StaticResource SelectedBackgroundBrush}"/>
          </Trigger>
          <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground"
                    Value="{StaticResource DisabledForegroundBrush}"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Теперь, что вы хотите сделать, это изменить это так, чтобы статический ресурс DisabledForegroundBrush вместо этого указывал на вашу кисть ресурса. Добавьте это к своему тегу Window.Resource, и вам будет хорошо.

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