WPF如何重写DataGridCell样式实现不同列单元格差异化样式
WPF DataGrid 分栏设置单元格悬停样式实现方案
直接利用DataGrid列自带的CellStyle属性为操作按钮列指定专属单元格样式即可,该属性设置的样式优先级高于你定义的全局DataGridCell样式,不需要改动现有全局样式的通用逻辑。

具体实现步骤
1. 补全全局样式的缺失代码
你贴出的全局DataGridCell样式存在两处会导致渲染异常的问题:一是缺少Template属性的Setter声明,二是ControlTemplate内没有承载单元格内容的根容器和内容呈现器,先补全后全局样式才能正常生效:
<Style TargetType="{x:Type DataGrid}"> <Style.Resources> <Style TargetType="{x:Type DataGridCell}"> <!-- 补全缺失的Template属性Setter --> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type DataGridCell}"> <!-- 补全单元格根容器和内容呈现器 --> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <ContentPresenter VerticalAlignment="Center" Margin="4,2"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="{StaticResource ControlBackgroundLine}" /> </Trigger> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="{StaticResource BackgroundSelected}" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Style.Resources> </Style>
2. 定义操作列专属单元格样式
在窗口资源或者全局资源字典中,新增按钮列专用的DataGridCell样式,通过BasedOn继承全局样式的通用逻辑,只需要覆盖鼠标悬停时的背景色为操作列专属颜色即可,避免重复编写通用样式代码:
<!-- 操作列专属单元格样式 --> <Style x:Key="OperationColumnCellStyle" TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type DataGridCell}"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <!-- 操作列内容居中显示 --> <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <!-- 替换为你需要的操作列悬停背景色 --> <Setter Property="Background" Value="Transparent"/> </Trigger> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="{StaticResource BackgroundSelected}" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
3. 为按钮列绑定专属样式
修改DataGrid的列定义,给删除、编辑两个DataGridTemplateColumn设置CellStyle属性,引用上面定义的专属样式即可。两个文本列不需要额外配置,会自动沿用全局单元格样式:
<DataGrid Grid.Row="3" ItemsSource="{Binding deckList}" AutoGenerateColumns="False" SelectionMode="Single" SelectionUnit="FullRow" Margin="10,10,0,0" > <DataGrid.Columns> <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" /> <DataGridTextColumn Header="SurName" Binding="{Binding Path=SurName}" /> <!-- 删除按钮列应用专属样式 --> <DataGridTemplateColumn CellStyle="{StaticResource OperationColumnCellStyle}"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Width="32"> <Image Source="/KillCard;component/Resources/Images/delete.png" Width="16"/> </Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <!-- 编辑按钮列应用专属样式 --> <DataGridTemplateColumn CellStyle="{StaticResource OperationColumnCellStyle}"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Width="32"> <Image Source="/KillCard;component/Resources/Images/edit.png" Width="16"/> </Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
可选优化
如果需要鼠标悬停在按钮上时按钮本身有独立的交互反馈,可以单独为按钮定义样式,和单元格样式逻辑互不冲突。
内容的提问来源于stack exchange,提问作者nihasmata
相关产品推荐
相关产品推荐

