如何跳过WPF DataGrid单元格焦点并进入其中的控件?

3
在一个WPF项目中,我有一个位于DataGridCell中的按钮。当我按tab键时,它会先聚焦到单元格,然后再聚焦到单元格内的按钮。如何跳过单元格聚焦?
这些列是动态的,我不知道哪一列有按钮或文本框。
1个回答

11

由于在 DataGrid 中的按钮不属于标准列类型之一,我假设你已经在使用 DataGridTemplateColumn

除了设置 DataGridTemplateColumn.CellTemplate 之外,还需设置 DataGridTemplateColumn.CellStyle,并通过样式将 DataGridCell.IsTabStop 属性设置为 False

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Binding="{Binding IsChecked}" Header="CheckBoxColumn" />
        <DataGridTextColumn Binding="{Binding Text}" Header="TextColumn" />
        <DataGridTemplateColumn Header="ButtonColumn">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="Text" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellStyle>
                <Style TargetType="DataGridCell">
                    <Setter Property="IsTabStop" Value="False" />
                </Style>
            </DataGridTemplateColumn.CellStyle>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

不幸的是,当您编辑单元格并按Enter键时,DataGrid会跳到下一行。如果定义了IsTabStop=False,则焦点会放在单元格上而不是模板化的内部控件上。我知道这很奇怪,我现在也面临着这个问题,我唯一看到解决它的方法是处理GotFocus DataGridCell事件。 - peterboccia
这个方向上有一些问题1 2,不确定它们是否对您有帮助。如果没有,请提出一个新的问题,确保包括整个“DataGrid”定义,并可能链接到这两个问题并说明它们为什么对您无效。 - LWChris
你提供的解决方案对于我来说可以接受,但我已经告诫@j.kahil这个解决方案对于任何DataGrid的Enter键行为来说都不足够。对于这个问题,我会使用GotFocus事件进行处理。就这些。 - peterboccia
如果您想让回车键作为Tab键使用,除了使用已接受的答案外,您还可以查看此链接(我无法发布代码,因为它被标记为太长):链接如果链接失效,请搜索EnterKeyTraversal。将该类添加到您的项目中,并在DataGrid上添加EnterKeyTraversal.IsEnabled="True"以启用它。 - John

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