Wpf 当DataGrid失去焦点时,如何对所选行进行去饱和?

Wpf 当DataGrid失去焦点时,如何对所选行进行去饱和?,wpf,xaml,triggers,wpftoolkit,multidatatrigger,Wpf,Xaml,Triggers,Wpftoolkit,Multidatatrigger,UI控件的常规约定是,当父控件处于焦点时,选定的文本、项目或行的颜色要明亮(例如,亮蓝色),而当控件不在焦点时,颜色要去饱和/变暗(例如,淡蓝色) <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Val

UI控件的常规约定是,当父控件处于焦点时,选定的文本、项目或行的颜色要明亮(例如,亮蓝色),而当控件不在焦点时,颜色要去饱和/变暗(例如,淡蓝色)

                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" TargetName="SelectBorder">
                                <Setter.Value>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#939F90" Offset="0"/>
                                        <GradientStop Color="#BCC4BA" Offset="1"/>
                                    </LinearGradientBrush>
                                </Setter.Value>
                            </Setter>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                        </MultiTrigger>
ListView/GridView
相反,WPF
DataGrid
控件默认情况下不遵循此约定。即使同一窗口中的另一个控件处于清晰的焦点位置,选定的行也会显示为亮

我认为这应该只是在
DataGridCell
中添加一个触发器的问题,如果
DataGrid
失焦,则该触发器将背景设置为
{DynamicResource{x:Static SystemColors.ControlBrushKey}
,但我无法确定要检查哪个属性
IsFocused
听起来像我想要的,但这不起作用
IsMouseCaptured
似乎也不起作用

这是我尝试过的最新触发器:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition
            Binding="{Binding IsSelected}"
            Value="True" />
        <Condition
            Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=wt:DataGrid}, Path=IsFocused}"
            Value="False"/>
    </MultiDataTrigger.Conditions>
    <Setter
        Property="BorderBrush"
        Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
    <Setter
        Property="Background"
        Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
    <Setter
        Property="Foreground"
        Value="Gray" />
</MultiDataTrigger>


当选定单元格且父控件未处于焦点时,如何使此触发器使单元格变暗?

从我的代码中提取:这是treeview项目背景在treeview未处于焦点时的触发器

                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" TargetName="SelectBorder">
                                <Setter.Value>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#939F90" Offset="0"/>
                                        <GradientStop Color="#BCC4BA" Offset="1"/>
                                    </LinearGradientBrush>
                                </Setter.Value>
                            </Setter>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                        </MultiTrigger>


我相信IsSelection是关键条件…

好吧,这是一个怪物,但它似乎有效:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition
            Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=wt:DataGridRow}, Path=IsSelected}"
            Value="True" />
        <Condition
            Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=wt:DataGrid}, Path=IsKeyboardFocusWithin}"
            Value="True" />
    </MultiDataTrigger.Conditions>
    <Setter
        Property="BorderBrush"
        Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
    <Setter
        Property="Background"
        Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
    <Setter
        Property="Foreground"
        Value="Black" />
</MultiDataTrigger>
<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition
            Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=wt:DataGridRow}, Path=IsSelected}"
            Value="True" />
        <Condition
            Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=wt:DataGrid}, Path=IsKeyboardFocusWithin}"
            Value="False" />
    </MultiDataTrigger.Conditions>
    <Setter
        Property="BorderBrush"
        Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
    <Setter
        Property="Background"
        Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
    <Setter
        Property="Foreground"
        Value="Gray" />
</MultiDataTrigger>


@AP,谢谢你的想法,但我遇到了一个编译器错误(“找不到样式属性'IsSelectionActive')。让我再挖一些,看看还有什么是浮动的。我想出了一个似乎可行的解决方案(见我的答案)。再次感谢你的帮助。