【问题标题】:Why datagrid selected row background changes after sort?为什么datagrid选择的行背景在排序后会发生变化?
【发布时间】:2013-07-08 09:56:56
【问题描述】:

我有一个带有一些项目(ListViewCollection)的数据网格(WPF)。 我有一个问题。我选择一行,然后按列排序。选中的行改变了它的背景。

下面我有数据网格代码。以及 2 张带有之前/之后的屏幕图片。可以看到蓝色变成了灰色

<DataGrid Background="White" IsSynchronizedWithCurrentItem="{x:Null}"  EnableRowVirtualization="False"  AutoGenerateColumns="False" CanUserSortColumns="True" ItemsSource="{Binding ConsoleLines}" 
                               GridLinesVisibility="None" IsReadOnly="True" RowHeaderWidth="0" Style="{StaticResource DataGridStyle}" Margin="5">

                        <DataGrid.Columns>
                            <DataGridTemplateColumn CanUserSort="True" Header="{Binding TimeHeader, Source={StaticResource ResLoc}}" SortMemberPath="Time" Width="*">             
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Time}" TextWrapping="Wrap" Foreground="{StaticResource DarkBackgroundBrush}"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTemplateColumn CanUserSort="True" Header="{Binding MessageHeader, Source={StaticResource ResLoc}}" SortMemberPath="Message" Width="*">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Message}" TextWrapping="Wrap" Foreground="{StaticResource DarkBackgroundBrush}"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTemplateColumn CanUserSort="True" Header="{Binding CategoryHeader, Source={StaticResource ResLoc}}" SortMemberPath="Category" Width="150">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Path=Category}" TextWrapping="Wrap" Foreground="{StaticResource DarkBackgroundBrush}"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                        </DataGrid.Columns>
                    </DataGrid>

【问题讨论】:

    标签: .net wpf listview datagrid background


    【解决方案1】:

    应用排序后,所选项目的颜色从 HighlightBrushKey 更改为 InactiveSelectionHighLightBrushKey。

    获得所需效果的最佳方法可能是将此 sn-p 复制到您的用户资源(或 DataGrid 资源)中,然后为每个给定状态选择所需的颜色...

    <UserControl.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="DeepSkyBlue"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="PowderBlue"/>
       <SolidColorBrush x:Key="{x:Static SystemColors.HotTrackBrushKey}" Color="CadetBlue"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="Plum"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Black"/>
    </UserControl.Resources>
    

    【讨论】:

    • 事后思考:我建议将这些资源放在对象图上尽可能高的位置。在我的 sn-p 中,它们位于用户控件上,但理想情况下应该位于应用程序级别。
    • 我很好奇为什么?实际上,我在 DataGrid.Resources 中将它们降低了。顺便谢谢!
    【解决方案2】:

    这是焦点问题...当您单击列标题进行排序时,该行不再具有焦点。

    使用 Snoop,当单击一行时,Keyboard.FocusedElementDataGridCell,但是当单击列标题时,它会更改为 HostWindow(至少在我的应用程序上)。

    添加以下内容,行在两种情况下都将具有相同的颜色:

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

    缺点是,单击列标题后,如果您想通过向上、向下...等键在网格中导航,则必须再次单击一行。这可能会惹恼用户。

    【讨论】:

    • 之前做过,不会改变任何东西。即使我将 HighlightBrush 更改为透明或其他。
    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 2019-06-23
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多