【问题标题】:WPF DataGrid: changing cell foreground color with triggersWPF DataGrid:使用触发器更改单元格前景色
【发布时间】:2016-04-11 16:24:43
【问题描述】:

我有一个 WPF DataGrid,其中有一些需要在其中包含蓝色文本的列。这是规范,不能更改。

现在,这通常不会成为问题,但是当用户在网格中选择一行时,该行会以蓝色突出显示,这在所有版本的 windows 中都是如此。

这是有问题的,因为该行变得难以阅读:

(注意上图是Win10的,选区的蓝色很淡,但是在客户端的机器上,Windows Server 2008,“选区的蓝色”就暗了很多,文字基本看不懂)

所以我尝试将以下样式应用于该特定列的单元格:

<Style TargetType="DataGridCell" x:Key="styleBlueCell">
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="False">
            <Setter Property="Foreground" Value="Blue"/>
        </Trigger>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Foreground" Value="White"/>
        </Trigger>
    </Style.Triggers>
</Style>

这个工作几乎完美......但是对于一个场景:当一个行被修改但DataGrid本身没有焦点时,行转动灰色,这会使事情混淆: p >

我试着弄乱MultiTriggers,像这样:

<Style TargetType="DataGridCell" x:Key="styleBlueCell2">
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding ElementName=gridAvanzamenti, Path=IsFocused}" Value="False"/>
                        <Condition Binding="{Binding IsSelected}" Value="True" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Foreground" Value="Blue"/>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>

但无论我尝试什么(按元素名称绑定、查找祖先等),我似乎都无法绑定到父 DataGrid。有人知道怎么做吗?

【问题讨论】:

  • 尝试将 {Binding ElementName=gridAvanzamenti, Path=IsFocused} 更改为 {Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=IsFocused} - 不过,您确实提到了尝试查找祖先,所以这是一个远景。
  • 谢谢。那是一半的答案。另一个条件也需要改变。我会发布完整的解决方案。

标签: c# wpf datagrid


【解决方案1】:

经过更多的尝试和错误以及 Ed Plunkett 提供的有用提示,以下是完整的解决方案:

<Style TargetType="DataGridCell" x:Key="styleBlueCell">
    <Style.Setters>
        <Setter Property="Foreground" Value="Blue"/>
    </Style.Setters>
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=IsKeyboardFocusWithin}" Value="True"/>
                <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Path=IsSelected}" Value="True"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Foreground" Value="White"/>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2018-09-26
    • 2021-03-10
    • 2011-10-15
    • 2010-12-17
    • 2015-05-14
    相关资源
    最近更新 更多