【问题标题】:Set GridViewColumnHeader style from inside a ListView style从 ListView 样式中设置 GridViewColumnHeader 样式
【发布时间】:2012-02-02 05:27:50
【问题描述】:

在我的一个项目中,我继承了 ListView 并通过设置新的控件模板来覆盖样式。我还覆盖了列标题样式。到目前为止,我已经找到了两种方法:

1) 通过设置样式键并在 GridView 中引用样式:

<Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle">
    <Setter Property="Background" Value="Wheat" />
</Style>

<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}">

2) 通过不为上述样式设置样式键。现在我不需要引用 GridView 中的样式,但它也会覆盖我的应用程序中的所有列表视图标题,而与列表视图类型无关。

由于我在我的应用程序中使用了许多列表视图,我想以第三种更灵活的方式来实现这一点;通过从 ListView 样式中设置 GridView.ColumnHeaderContainerStyle。这样我就不需要在每个 GridView 中引用标题样式。到目前为止,这是 XAML 的简化版本:

<Window.Resources>
    <Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle">
        <Setter Property="Background" Value="Wheat" />
    </Style>

    <Style TargetType="{x:Type list:MyListView}">
        <Setter Property="GridView.ColumnHeaderContainerStyle" Value="{StaticResource MyHeaderStyle}" />            
        <Setter Property="Background" Value="Linen" />                                   
    </Style>
</Window.Resources>

<list:MyListView>
    <list:MyListView.View>
        <GridView>
            <GridViewColumn Header="Column1" />
            <GridViewColumn Header="Column2" />
        </GridView>
    </list:MyListView.View>
</list:MyListView>

不幸的是,这并没有设置标题样式...如果我对上面的 XAML 进行此更改,它可以工作:

<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}">

有什么想法吗?

【问题讨论】:

    标签: wpf listview gridview columnheader


    【解决方案1】:

    如果没有key,则适用于指定TargetType的所有元素。如果您的样式有键,则必须明确使用它:

    <GridViewColumn HeaderContainerStyle="{StaticResource MyHeaderStyle}" Header="Column1"/>
    

    或者,您可以在ListView 中设置样式,因此它仅适用于其中的元素:

    <list:MyListView>
        <list:MyListView.Resources>
            <Style TargetType="{x:Type GridViewColumnHeader}">
                <Setter Property="Background" Value="Wheat" />
            </Style>
        </list:MyListView.Resources>
    </list:MyListView>
    

    【讨论】:

      【解决方案2】:

      感谢 snurre 为我指明了正确的方向。我找到了一种方法来完成我想要的。

      您不需要将资源部分放在 ListView 中(每个 ListView 的那种自定义标签是我首先想要摆脱的)。资源可以改为 ListView 样式。

      这是更新后的 XAML,完全符合我的要求:

      <Window.Resources>
          <Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle">
              <Setter Property="Background" Value="Wheat" />
          </Style>
      
          <Style TargetType="{x:Type list:MyListView}">
              <Style.Resources>
                  <Style TargetType="{x:Type GridViewColumnHeader}" BasedOn="{StaticResource MyHeaderStyle}" />
              </Style.Resources>
      
              <Setter Property="Background" Value="Linen" />                                   
          </Style>
      </Window.Resources>
      
      <list:MyListView>
          <list:MyListView.View>
              <GridView>
                  <GridViewColumn Header="Column1" x:Name="col1" />
                  <GridViewColumn Header="Column2" x:Name="col2" />
              </GridView>
          </list:MyListView.View>
      </list:MyListView>
      

      【讨论】:

        猜你喜欢
        • 2015-04-17
        • 2014-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        相关资源
        最近更新 更多