代码之家  ›  专栏  ›  技术社区  ›  devuxer

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

  •  1
  • devuxer  · 技术社区  · 16 年前

    UI控件的正常约定是,当父控件处于焦点时,所选文本、项或行将显示为明亮的颜色(例如,亮蓝色),而当控件处于焦点之外时,所选文本、项或行将显示为不饱和/暗度(例如,淡蓝色)。

    相比之下 ListView/GridView WPF DataGrid 默认情况下,控件不遵循此约定。即使同一窗口中的另一个控件已清晰聚焦,选定的行也会显示为明亮。

    我认为这应该只是给 DataGridCell 将背景设置为 {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>
    

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

    2 回复  |  直到 12 年前
        1
  •  2
  •   devuxer    16 年前

    嗯,这是一个怪物,但它似乎起作用:

    <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>
    
        2
  •  0
  •   Alastair Pitts    16 年前

    从我的代码中抽出一点:当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>
    

    我相信选修课是关键条件…