非活动时DataGrid的选定行颜色


72

当DataGrid失去焦点时,如何设置WPF DataGrid的样式以更改所选行的颜色?

Answers:


125

经过多年的搜索,我发现了一种出乎意料的简单方法,它比之前发布的Got / LostFocus方法更干净:

<DataGrid.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="DarkGray"/>
</DataGrid.Resources>

这只是将非活动背景色设置为DarkGray,将活动背景色保留为默认值,但是您当然也可以使用SystemColors.HighlightBrushKey进行更改。

非活动选择的前台资源键是SystemColors.InactiveSelectionHighlightTextBrushKey。


1
<SolidColorBrush x:Key =“ {x:Static SystemColors.InactiveSelectionHighlightBrushKey}” Color =“ {DynamicResource {x:Static SystemColors.HighlightColorKey}}”“ />-不正确的文本颜色
jtimperley,2012年

3
InactiveSelectionHighlightBrushKey仅适用于FW 4.5,并在FW 4.0中引发异常。我在此stackoverflow.com/a/13827971/1815957
Mikhail Shcherbakov

47
在.NET 4.5中,我使用以下代码:<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="{x:Static SystemColors.HighlightColor}"/> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="{x:Static SystemColors.HighlightTextColor}"/>
Heiner 2013年

1
为什么我们需要为SystemColor键指定一个新值,而不像通常那样给Background提供另一个颜色?是因为DataGrid覆盖了代码中的Background颜色?还是与我们的价值来自静态环境有关?
eran otzap

4
InactiveSelectionHighlightBrushKey在.net 4.0中不可用:(
BigSandwich

24

适用于4.0的完整解决方案。请注意,这在CellStyle上。

<DataGrid.CellStyle>
    <!--Override Highlighting so that its easy to see what is selected even when the control is not focused-->
    <Style TargetType="{x:Type DataGridCell}">
        <Style.Triggers>
            <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>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=IsKeyboardFocusWithin}" Value="False" />
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <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}}" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.CellStyle>

8

像这样做:

<DataGrid ...>
    <DataGrid.Resources> 
        <Style TargetType="DataGridRow"> 
            <Style.Resources> 
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>                                  
            </Style.Resources> 
        </Style> 
   </DataGrid.Resources> 
...

感谢你的回答!更改选择颜色。而且也适用于主动聚焦的情况。因此,该行始终为红色,无论它处于活动状态还是非活动状态。我还需要另一种行为:DataGrid具有焦点时蓝色选中行,DataGrid没有焦点时红色选中行。
white.zaz

@HCL为什么我们需要为SystemColor键指定一个新值,而不像通常那样给Background提供另一个颜色?是因为DataGrid覆盖了代码中的Background颜色?还是与我们的价值来自静态环境有关?
eran otzap 2013年

6

这些答案都没有给我我想要的东西。史蒂夫街(Steve Streeting)的最高评分更改了我不想更改的数据网格的其他部分,其他答案没有提供无效的颜色更改,而是仅针对行。因此,这是他们的答案的混合体,它们在行上而不在网格的其他位置上更改不活动的颜色。

<DataGrid.Resources>
    <Style TargetType="DataGridRow">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="DarkGray"/>
        </Style.Resources>
    </Style>
</DataGrid.Resources>

4

对于.Net Framework 4.0(或者如果您不想使用InactiveSelection ...笔刷键):创建一个DataGridRow样式/控件模板,并添加以下触发器:

<ControlTemplate.Triggers>
    <Trigger  Property="IsSelected" Value="true">
        <Setter Property="Background" Value="{DynamicResource SelectionBrush}" />
    </Trigger>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
            <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=IsKeyboardFocusWithin}" Value="False" />
        </MultiDataTrigger.Conditions>
        <MultiDataTrigger.Setters>
            <Setter Property="Background" Value="{DynamicResource InactiveSelectionBrush}" />
        </MultiDataTrigger.Setters>
    </MultiDataTrigger>
</ControlTemplate.Triggers>

您可能必须对DataGrid.CellStyle而不是对行执行此操作。使用每种样式对我来说仍然不清楚。
BigSandwich

1
好的,这段代码在哪里?在<DataGrid.RowStyle>或<DataGrid>中。完整,可行的答案将很有用。
Stealth Rabbi 2015年

4

晚期答案:

这在.Net 4.0中有效,您不必对颜色进行硬编码:

<Style TargetType="DataGridRow">
    <Style.Resources>
         <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{x:Static SystemColors.HighlightColor}" />
         <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="{x:Static SystemColors.HighlightTextColor}"/>
    </Style.Resources>
</Style>


3

您应该像这样在DataGrid中定义“ DataGrid.CellStyle”部分:

    <DataGrid>
        <DataGrid.CellStyle>
            <Style TargetType="DataGridCell">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="LightBlue"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.CellStyle>
    </DataGrid>

2

自己找到答案。

将画笔添加到DataGrid的资源中,可以从后面的代码中更改其“颜色”属性,并对其进行引用HighlightBrushKey:

<DataGrid.Resources>
    <SolidColorBrush x:Key="SelectionColorKey" Color="DarkGray"/>
    <Style TargetType="DataGridRow">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{Binding Source={StaticResource SelectionColorKey}, Path=Color}"/>
        </Style.Resources>
    </Style>
</DataGrid.Resources>

然后添加DataGrids事件处理程序以手动更改颜色:

private void DataGrid1_LostFocus(object sender, RoutedEventArgs e)
{
    ((SolidColorBrush)DataGrid1.Resources["SelectionColorKey"]).Color = Colors.DarkGray;
}

private void DataGrid1_GotFocus(object sender, RoutedEventArgs e)
{
    ((SolidColorBrush)DataGrid1.Resources["SelectionColorKey"]).Color = SystemColors.HighlightColor;
}

private void DataGrid1_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    ((SolidColorBrush)DataGrid1.Resources["SelectionColorKey"]).Color = Colors.DarkGray;
}

2

我将此添加到ResourceDictionary中,以便将其应用于程序中的所有数据网格。

<Style TargetType="DataGrid">
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="LightGray"/>
    </Style.Resources>        
</Style>

0

对于.NET 4.0或更高版本:还可以通过编程设置颜色:

if (TestDataGrid.RowStyle == null)
{
  TestDataGrid.RowStyle = new Style(typeof(DataGridRow));
}

// Set colors for the selected rows if focus is inactive
TestDataGrid.RowStyle.Resources.Add(SystemColors.ControlBrushKey, new SolidColorBrush(Colors.SkyBlue));
TestDataGrid.RowStyle.Resources.Add(SystemColors.ControlTextBrushKey, new SolidColorBrush(Colors.Black));

// Set colors for the selected rows if focus is active
TestDataGrid.RowStyle.Resources.Add(SystemColors.HighlightBrushKey, new SolidColorBrush(Colors.Red));
TestDataGrid.RowStyle.Resources.Add(SystemColors.HighlightTextBrushKey, new SolidColorBrush(Colors.White));

对于.NET 4.5或更高版本,可以通过以下方法以编程方式设置颜色:

if (TestDataGrid.Resources == null)
{
  TestDataGrid.Resources = new ResourceDictionary();
}

// Set colors for the selected rows if focus is inactive
TestDataGrid.Resources.Add(SystemColors.InactiveSelectionHighlightBrushKey, new SolidColorBrush(Colors.SkyBlue));
TestDataGrid.Resources.Add(SystemColors.InactiveSelectionHighlightTextBrushKey, new SolidColorBrush(Colors.Black));

// Set colors for the selected rows if focus is active
TestDataGrid.Resources.Add(SystemColors.HighlightBrushKey, new SolidColorBrush(Colors.Red));
TestDataGrid.Resources.Add(SystemColors.HighlightTextBrushKey, new SolidColorBrush(Colors.White));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.