如何修改DataGrid列中Path控件选中行时的Stroke颜色
WPF DataGrid选中行时Path控件Stroke颜色无法修改的解决方案
我有一个DataGrid控件,第二列使用Path控件根据绑定的RunName属性展示不同图形。选中行时,其他列文本颜色会从黑色变为白色,但Path的Stroke颜色在选中行背景下几乎不可见,且无法通过现有样式修改它的颜色。
现有DataGrid代码
<DataGrid x:Name="EpicsDataGrid" AlternationCount="1" AutoGenerateColumns="false" IsReadOnly="true" ItemsSource="{Binding}"> <DataGrid.Columns> <DataGridTextColumn Width="*" MinWidth="150" Binding="{Binding EpicName}" Header="Epic Name" /> <DataGridTemplateColumn Width="110" MinWidth="90" Header="Recurency"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <StackPanel HorizontalAlignment="Center" Orientation="Horizontal"> <Path x:Name="CalendarIcon" Height="40" Stretch="Uniform" Stroke="Gray" StrokeThickness=".5"> <Path.Style> <Style TargetType="Path"> <Style.Triggers> <DataTrigger Binding="{Binding RunName}" Value="Yearly"> <Setter Property="Data" Value="{DynamicResource calendar-recuring}" /> </DataTrigger> <DataTrigger Binding="{Binding RunName}" Value="Incidental"> <Setter Property="Data" Value="{DynamicResource calendar}" /> </DataTrigger> </Style.Triggers> </Style> </Path.Style> </Path> </StackPanel> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Width="120" MinWidth="50" Binding="{Binding LastRun}" Header="Last year added" /> </DataGrid.Columns> </DataGrid>
现有DataGridCell样式代码
<Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="FontWeight" Value="Bold" /> <Setter Property="Foreground" Value="White" /> </Trigger> </Style.Triggers> </Style>
问题原因
原代码中Path的Stroke是直接设置在控件标签上的本地值,WPF中本地值的优先级高于样式中的Setter,所以即使DataGridCell选中时修改了Foreground,Path的Stroke也不会自动继承或被样式修改。
解决方案
方法一:将Path的Stroke移到Style中并添加选中触发规则
把Path的默认Stroke值放到Style的Setter里,再添加一个Trigger绑定父级DataGridCell的IsSelected属性,设置选中时的Stroke颜色:
<Path x:Name="CalendarIcon" Height="40" Stretch="Uniform" StrokeThickness=".5"> <Path.Style> <Style TargetType="Path"> <!-- 默认Stroke颜色 --> <Setter Property="Stroke" Value="Gray" /> <Style.Triggers> <DataTrigger Binding="{Binding RunName}" Value="Yearly"> <Setter Property="Data" Value="{DynamicResource calendar-recuring}" /> </DataTrigger> <DataTrigger Binding="{Binding RunName}" Value="Incidental"> <Setter Property="Data" Value="{DynamicResource calendar}" /> </DataTrigger> <!-- 绑定父级DataGridCell的选中状态 --> <Trigger Property="IsSelected" RelativeSource="{RelativeSource AncestorType=DataGridCell}" Value="True"> <Setter Property="Stroke" Value="White" /> </Trigger> </Style.Triggers> </Style> </Path.Style> </Path>
方法二:让Path的Stroke继承DataGridCell的Foreground
将Path的Stroke绑定到父级DataGridCell的Foreground属性,这样选中行时DataGridCell的Foreground变为白色,Path的Stroke也会同步变化:
<Path x:Name="CalendarIcon" Height="40" Stretch="Uniform" Stroke="{Binding Foreground, RelativeSource={RelativeSource AncestorType=DataGridCell}}" StrokeThickness=".5"> <Path.Style> <Style TargetType="Path"> <Style.Triggers> <DataTrigger Binding="{Binding RunName}" Value="Yearly"> <Setter Property="Data" Value="{DynamicResource calendar-recuring}" /> </DataTrigger> <DataTrigger Binding="{Binding RunName}" Value="Incidental"> <Setter Property="Data" Value="{DynamicResource calendar}" /> </DataTrigger> </Style.Triggers> </Style> </Path.Style> </Path>
两种方法都能解决选中行时Path的Stroke颜色不可见的问题,方法二更简洁,利用了属性继承的特性。
内容的提问来源于stack exchange,提问作者Herbert Nijkamp
相关产品推荐
相关产品推荐

