首页 文章

wpf:DataGrid禁用选定的行样式 - 或行选择

提问于
浏览
39

我看到很多关于如何在DataGrid中为Selected行设置样式的示例,例如:

How can I set the color of a selected row in DataGrid

我可以禁用选定的行样式吗?我不想要覆盖选择行更改的每一件事 . 只是不希望任何明显的变化 . 要比创建模板更简单 .

要么..

禁用选择行,如果这更容易..但从浏览这个看似hacky的论坛

Disable selecting in WPF DataGrid

6 回答

  • 7

    想出XAML摆脱选择风格..不理想,但足够接近..

    <Style x:Key="CellStyle" TargetType="{x:Type DataGridCell}">
        <Setter Property="Foreground" Value="Black" />
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="{x:Null}" />
                <Setter Property="BorderBrush" Value="{x:Null}" />
            </Trigger>
        </Style.Triggers>
    </Style>
    
  • 17

    这对我有用:

    <DataGrid>
        <DataGrid.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Style.Triggers>
                    <Trigger Property="DataGridCell.IsSelected" Value="True">
                        <Setter Property="BorderBrush">
                            <Setter.Value>
                                <SolidColorBrush Color="Transparent"/>
                            </Setter.Value>
                        </Setter>
                        <Setter Property="Foreground"
                                Value="{DynamicResource
                                       {x:Static SystemColors.ControlTextBrushKey}}"/>
                        <Setter Property="Background">
                            <Setter.Value>
                                <SolidColorBrush Color="Transparent"/>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.CellStyle>
        <!-- ... -->
    </DataGrid>
    
  • 5

    我找到了另一种适合我情况的方法 . 我为所有单元格设置了这种样式,因为我不希望用户选择任何单元格 .

    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="IsHitTestVisible" Value="False"/>
    </Style>
    
  • 1

    我将首先回答第二个问题:要禁用行的选择,您可以更改DataGrid的RowStyle .

    <DataGrid>
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Setter Property="IsEnabled" Value="False"/>
            </Style>
        </DataGrid.RowStyle>
        <!--Other DataGrid items-->
    </DataGrid>
    

    但是,这会更改文本样式,因为行本身现在已“禁用” . 它也没有否定用户仍然可以右键单击该行来选择它的事实 . 如果您真的想要禁用与datagrid行的任何类型的交互,您可以执行以下操作:

    <DataGrid>
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Setter Property="IsHitTestVisible" Value="False"/>
            </Style>
        </DataGrid.RowStyle>
        <!--Other DataGrid items-->
    </DataGrid>
    

    由于行仍处于启用状态,因此文本样式不会更改 .

    现在,如果您只想更改所选行的样式但仅保留功能,则可以执行以下操作(这与@Dan Stevens的答案基本相同) . ControlTextBrushKey是系统用于为文本项着色的画笔 . 有关DynamicResource和StaticResource之间的解释,请查看this answer .

    <DataGrid>
        <DataGrid.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Style.Triggers>
                    <Trigger Property="DataGridCell.IsSelected" Value="True">
                        <Setter Property="BorderBrush" Value="Transparent"/>
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                        <Setter Property="Background" Value="Transparent"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.CellStyle>
        <!--Other DataGrid items-->
    </DataGrid>
    

    重要的是要注意,当选择行时,上述解决方案不会更改DataGridRowHeader的样式,如下所示(选择第一行) .

    enter image description here

  • 70

    这相对简单:

    datagrid.SelectionChanged += (obj, e) =>
      Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
        datagrid.UnselectAll()));
    

    这将禁用DataGrid上的所有选择 .

    如果您不想完全禁用选择但只是隐藏它,则需要修改模板 .

  • 20

    对于像我这样拥有不同风格的单元格并且不想覆盖所有样式也不想为每种样式添加触发器的人来说,这是一个不错的选择:

    <DataGrid.Resources>
        <SolidColorBrush 
            x:Key="{x:Static SystemColors.HighlightBrushKey}" 
            Color="#333333"/>
        <SolidColorBrush 
            x:Key="{x:Static SystemColors.HighlightTextBrushKey}" 
            Color="Black"/>
        <SolidColorBrush 
            x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" 
            Color="Black"/>
        <SolidColorBrush 
            x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" 
            Color="Black"/>
    </DataGrid.Resources>
    

    HighlightBrushKey 是带有活动选择的突出显示边框, HighlightTextBrushKey 是带有活动选择的文本颜色

    在我的情况下,我希望非活动选择看起来未被选中:

    InactiveSelectionHighlightBrushKey 是选择处于非活动状态时的边框, InactiveSelectionHighlightTextBrushKey 是选择处于非活动状态时的文本

    仅供参考:SystemColors是一个静态类,是System.Windows.Media命名空间的一部分 . 你可以检查它,无耻地覆盖你不喜欢的任何颜色!

相关问题