WPF overriding ListViewItem style when use Material Design In XAML Toolkit
我将XAML Toolkit中的Material Design安装到了我的项目中。 我有ListView本身包含GridView(带有GridViewColumns),并且我想覆盖此表中每一行的样式。 但是在每种情况下,我都会从XAML Toolkit中的Material Design中丢失样式。
我尝试做几件事:
1)根据目标类型覆盖现有样式:
1 2 3 4 5 | <ListView.ItemContainerStyle> <Style TargetType="ListViewItem" BasedOn="{StaticResource {x:Type ListViewItem}}"> <Setter Property="Background" Value="Green" /> </Style> </ListView.ItemContainerStyle> |
我有重载的样式,但是在这种情况下,我在GridView中失去了类型识别能力(列包含正确的标题,但是值包含模型的调用结果ToString()方法)
2)我使用了XAML Toolkit中的Material Design中的具体样式-MaterialDesignGridViewItem:
1 2 3 4 5 | <ListView.ItemContainerStyle> <Style TargetType="ListViewItem" BasedOn="{StaticResource MaterialDesignGridViewItem"> <Setter Property="Background" Value="Green" /> </Style> </ListView.ItemContainerStyle> |
在这种情况下,我得到了工作解决方案(看起来),但是当我确实添加触发器时,我失去了材质样式(仅获得颜色,而没有动画)。
3)在其他情况下,我会丢失所有的材质样式,并返回到WPF默认样式。
希望对我们有所帮助。
1 2 3 4 5 | <ListView.ItemContainerStyle> <Style TargetType="ListViewItem" BasedOn="{StaticResource MaterialDesignListBoxItem"> <Setter Property="Background" Value="Green" /> </Style> </ListView.ItemContainerStyle> |
您的扩展样式应基于MaterialDesignListBoxItem,而不是使用MaterialDesignGridViewItem。
其他项目也一样。 这帮助了我使用曾经采用MaterialDesign风格的TreeViewItem,但在我添加BasedOn属性之前,它也被覆盖了。
1 2 3 4 5 6 7 8 9 | <TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource MaterialDesignTreeViewItem}"> <EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/> <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/> <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/> <EventSetter Event="TreeViewItem.MouseLeftButtonDown" Handler="treeView_MouseDown"/> <EventSetter Event="TreeViewItem.MouseRightButtonDown" Handler="treeView_MouseRightDown"/> </Style> </TreeView.ItemContainerStyle> |
请注意," MaterialDesignListBoxItem"后面缺少"}",因此:
1 | <Style TargetType="ListViewItem" BasedOn="{StaticResource MaterialDesignListBoxItem}"> |