我可以获取WPF ListBox来继承父元素的画笔吗?

时间:2010-03-12 14:10:05

标签: .net wpf xaml listbox

我的WPF窗口将其前景画笔设置为资源字典中的画笔,我希望窗口中的所有文本都具有此颜色,因此我不会在其他任何内容中触摸前景画笔。

文本框获得颜色
文本块获得颜色
按钮获得颜色

列表框没有颜色,因此它们的内容也没有。

有没有办法让Listbox在这方面表现得像其他控件一样?

假设没有,并且这是设计原因,理由是什么?

编辑:

似乎我的问题不够明确。

我了解如何创建样式和资源并将其应用于ListBox es;我想知道为什么我需要为某些控件执行此操作时需要其他人 - 为什么有些继承属性而其他人没有 - 以及是否有任何方法可以使它们全部以同样的方式继承。

3 个答案:

答案 0 :(得分:8)

ListBox和其他一些控件未继承Foreground属性的原因是它使用默认样式的Setter显式重写。不幸的是,即使您为ListBox分配了一个不包含Foreground属性setter的自定义样式,它仍会在尝试继承其父级的值之前回退到使用默认样式。

确定属性值的优先顺序是:

  1. 本地值
  2. 样式触发器
  3. 模板触发器
  4. 样式制定者
  5. 主题样式触发器
  6. 主题样式制定者
  7. 属性值继承
  8. 默认值
  9. 由于#6是在控件的默认样式中定义的,因此WPF不会尝试确定#7的值。

答案 1 :(得分:1)

这是列表框项目的样式:

<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标记中,你应该很高兴。

答案 2 :(得分:1)

你可以这样做:

<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>

您可以使用Binding表达式绑定到为应用程序定义的颜色资源,而不是Color="Red"