所选行的 WPF DataGrid RowStyle 不改变背景和前景色

Posted

技术标签:

【中文标题】所选行的 WPF DataGrid RowStyle 不改变背景和前景色【英文标题】:WPF DataGrid RowStyle for selected row not changing the background and foreground color 【发布时间】:2013-01-30 08:05:45 【问题描述】:

我在 Windows 7 上使用 Visual Studio 2012。我需要知道为什么 Grid 所选行的以下样式不适用于背景和前景色,但适用于 BorderBrush 和 BorderThickness 等其他属性?虽然当鼠标悬停在网格行上时我可以看到它们发生变化。

<Style x:Key="gridRowStyle" TargetType="x:Type DataGridRow">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="PeachPuff"/>
            <Setter Property="Foreground" Value="BlueViolet"/>
        </Trigger>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="PeachPuff"/>
            <Setter Property="Foreground" Value="BlueViolet"/>
            <Setter Property="BorderBrush" Value="BlueViolet" />
            <Setter Property="BorderThickness" Value="2" />

        </Trigger>
    </Style.Triggers>
</Style>

这是我在网格上的使用方式。

<DataGrid RowStyle="StaticResource gridRowStyle">

我强调要知道“为什么”而不是解决问题,因为如果我使用网格单元样式而不是行样式,我已经有了解决问题的方法,如下所示:

<Style x:Key="gridCellStyle" TargetType="x:Type DataGridCell">
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="PeachPuff"/>
            <Setter Property="Foreground" Value="BlueViolet"/>
        </Trigger>
    </Style.Triggers>
</Style>

【问题讨论】:

会不会是因为 GridCell 的内容覆盖了 GridRow?你试过在 Snoop 中查看控件吗? 我对您发布的内容进行了快速测试,效果很好。您能否提供有关 DataGrid 和任何 Row 定义的更多详细信息? 我是 WPF 新手,以前从未使用过 snoop。我会试试看发生了什么。谢谢.... @BrentStewart,这里是 DataGrid 的完整定义: 其中 RecordList 是简单类 Record 对象的自定义集合,在当前窗口资源中定义了两个公共属性 FirstName 和 LastName: public class Record public string FirstName set;得到; 公共字符串姓氏 设置;得到; 公共类 MyCollection : ObservableCollection 【参考方案1】:

在具有以下默认样式触发器的 DataGridCell 的默认样式中。

<Trigger Property="IsSelected" Value="True">
    <Setter Property="Background" Value="DynamicResource x:Static SystemColors.HighlightBrushKey"/>
    <Setter Property="Foreground" Value="DynamicResource x:Static SystemColors.HighlightTextBrushKey"/>
    <Setter Property="BorderBrush" Value="DynamicResource x:Static SystemColors.HighlightBrushKey"/>
</Trigger>

因此,如果您为 DataGridRow 编写触发器,那么它将仅适用于在可视树中放置在 DataGridCell 之前的元素。

所以要在选择时更改背景和前景,您必须以 DataGridCell 样式编写触发器或从样式中删除默认触发器。

【讨论】:

【参考方案2】:

只需在数据网格中的行级别删除此属性,它们的优先级高于触发属性。

内扎克

【讨论】:

以上是关于所选行的 WPF DataGrid RowStyle 不改变背景和前景色的主要内容,如果未能解决你的问题,请参考以下文章

选择行时设置文本WPF DataGrid行的颜色

WPF Datagrid 样式选定的行

C# WPF Datagrid:从 SelectionChanged 事件中获取值

wpf:DataGrid 禁用选定的行样式 - 或行选择

iOS 14 UIPickerView 所选行的颜色

如何读取表格视图中所选行的背景颜色?