在 WPF 数据表格中使一行无法获得焦点

3

我正在尝试找出如何使以下WPF DataGrid中的行不可聚焦。正如您所看到的,我尝试在DataGrid中添加<DataGrid.Resources>部分,其中我指定了一个DataGrid单元格样式,但这并没有起作用。我错过了什么吗?

<DataGrid Name="grdResources"
AutoGenerateColumns="False" SelectionUnit="FullRow"
AlternatingRowBackground="LightBlue" CanUserDeleteRows="False" CanUserAddRows="False"
CanUserReorderColumns="False" ClipboardCopyMode="ExcludeHeader">

<DataGrid.Resources>
    <DataGridTemplateColumn.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="Focusable" Value="False"/>
        </Style>
    </DataGridTemplateColumn.CellStyle>
</DataGrid.Resources>

<DataGrid.Columns>
    <DataGridTemplateColumn Header="Select" IsReadOnly="True" >
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <CheckBox Name="Select" Tag="{Binding}" Click="Select_Click"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

    <DataGridTemplateColumn Header="Key" IsReadOnly="True">
        <DataGridTemplateColumn.CellTemplate >
            <DataTemplate>
                <Label Content="{Binding Path=Key}"></Label>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

    <DataGridTemplateColumn Header="Value" IsReadOnly="True">
        <DataGridTemplateColumn.CellTemplate >
            <DataTemplate>
                <TextBlock TextWrapping="Wrap" Text="{Binding Path=Value}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>

编辑 对于那些感兴趣的人,我最终覆盖了SelectedRow样式,以便在选中时不会突出显示该行。这是我的<DataGrid.Resources>部分更改后的样子:

    <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="Transparent"/>
                    <Setter Property="Foreground" Value="Black"/>
                    <Setter Property="BorderBrush" Value="Transparent"/>
                    <Setter Property="BorderThickness" Value="1"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
1个回答

6

Use IsHitTestVisible = False

<DataGrid.Resources>
    <Style x:Key="NoFocusColumStyle" TargetType="{x:Type DataGridCell}">
        <Setter Property="IsHitTestVisible" Value="False"/>
    </Style>
</DataGrid.Resources>

然后将样式应用于您想要限制焦点的任何列。
<DataGridTextColumn CellStyle="{StaticResource NoFocusColumStyle}" ... />

谢谢!这个方法可以使行不可聚焦,但是我在DataGrid中的第一列有一个复选框用于选择行,这会导致复选框无法点击。 - Tom
@Tom 给你的样式添加一个键,并在 DataGrid.Columns 中将单元格样式应用于应该是只读的列。 <DataGridTextColumn CellStyle="{StaticResource NoFocusColumn}" ... /> - Rachel
1
这仍然使复选框列可选择。我想能够单击复选框选择行,而不会选择任何单元格并随后突出显示。如果我没有在我的原始帖子中清楚地指明这一点,那么很抱歉。 - Tom
2
@Tom 听起来你真正想要的是覆盖 SelectedRow 样式,使其不突出显示行。请查看 https://dev59.com/mW855IYBdhLWcg3wGQNM 了解如何实现的示例。 - Rachel
那篇文章正是我所需要的。谢谢! - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接