在我的一个项目中,我继承了ListView并通过设置新的控件模板来覆盖样式。我还重写了列标题样式。到目前为止,我已经找到了两种方法:
1)通过设置样式键并引用GridView中的样式:
<Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle">
<Setter Property="Background" Value="Wheat" />
</Style>
<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}">
2)不为上述样式设置样式键。现在我不需要在GridView中引用样式,但它也会覆盖我的应用程序中的所有listview头,而不依赖于listview类型。
由于我在我的应用程序中使用了很多listviews,因此我希望以第三种更灵活的方式实现这一点;通过在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}">
有什么想法吗?
答案 0 :(得分:6)
感谢 snurre 让我指向正确的方向。我找到了一种方法来完成我想要的东西。
您不需要将List部分放在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>
答案 1 :(得分:3)
如果没有密钥,则它适用于指定的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>