You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:30:47