在WPF数据网格中的列之间禁用tabstop

在WPF数据网格中的列之间禁用tabstop,wpf,xaml,wpfdatagrid,tabstop,Wpf,Xaml,Wpfdatagrid,Tabstop,我有一个WPF工具包datagrid,其中包含多个列。我试图获得一种行为,在这种行为中,您可以使用tab键进入网格,然后使用单个选项卡再次进行制表。例如,我不想在网格的所有列或单元格中进行一次输入和一次输出 如果有一个简单的解决方案,我尝试过将TabNavigation设置为一次,同时禁用TabStop(下面的代码中没有显示),并将列上的TabNavigation设置为None,但没有成功 我是否缺少一些东西,或者需要在代码中处理Tab键 <my:DataGrid Name

我有一个WPF工具包datagrid,其中包含多个列。我试图获得一种行为,在这种行为中,您可以使用tab键进入网格,然后使用单个选项卡再次进行制表。例如,我不想在网格的所有列或单元格中进行一次输入和一次输出

如果有一个简单的解决方案,我尝试过将TabNavigation设置为一次,同时禁用TabStop(下面的代码中没有显示),并将列上的TabNavigation设置为None,但没有成功

我是否缺少一些东西,或者需要在代码中处理Tab键

        <my:DataGrid Name="datagrid"
                     AutoGenerateColumns="False" IsReadOnly="True"
                     CanUserAddRows="False" CanUserDeleteRows="False"
                     Background="White"
                     KeyboardNavigation.TabNavigation="Once">
            <my:DataGrid.Columns>
                <my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" ></my:DataGridTextColumn>
                <my:DataGridTextColumn x:Name="Ticker" Header="Ticker" Width="1*" KeyboardNavigation.TabNavigation="None"></my:DataGridTextColumn>
                <my:DataGridTextColumn x:Name="OfficialName" Header="Name" Width="3*" KeyboardNavigation.TabNavigation="None"></my:DataGridTextColumn>
            </my:DataGrid.Columns>
        </my:DataGrid>

有趣的是,直接在DataGridTextColumn上设置键盘导航不起作用。另一种可行的方法是设置DataGridCell样式

<toolkit:DataGrid.CellStyle>
    <Style TargetType="{x:Type toolkit:DataGridCell}">
        <Setter Property="KeyboardNavigation.IsTabStop"
                Value="False" />
        <Style.Triggers>
            <Trigger Property="IsSelected"
                     Value="True">
                <Setter Property="KeyboardNavigation.IsTabStop"
                        Value="True" />
            </Trigger>
        </Style.Triggers>
    </Style>
</toolkit:DataGrid.CellStyle>

将其附加到DataGrid将确保一个单元格仅是一个TabStop(如果已选中)。但是,如果您选择的是整行,并且没有在DataGrid上设置SelectionUnit=“Cell”,则它仍将循环遍历当前选定行的每一列

相反,我们可以在DataGrid中创建多个CellStyles作为资源:

<toolkit:DataGrid.Resources>

    <Style  x:Key="SelectableCellStyle"
            TargetType="{x:Type toolkit:DataGridCell}">
        <Setter Property="KeyboardNavigation.IsTabStop"
                Value="False" />
        <Style.Triggers>
            <Trigger Property="IsSelected"
                     Value="True">
                <Setter Property="KeyboardNavigation.IsTabStop"
                        Value="True" />
            </Trigger>
        </Style.Triggers>
    </Style>

    <Style TargetType="{x:Type toolkit:DataGridCell}">
        <Setter Property="KeyboardNavigation.IsTabStop"
                Value="False" />
    </Style>

</toolkit:DataGrid.Resources>

现在我们有了一个默认应用于所有DataGridCells并关闭TabStop的样式,以及一个键控样式,该样式允许在选中单元格(或整行)时进行选择。将此样式仅应用于单个列将提供相同的单个选项卡,同时允许选择整行及其所有列

 <my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" CellStyle={StaticResource  SelectableCellStyle}"/>

谢谢你。为了使制表位对列被禁用,我接受了你的答案并对其进行了轻微修改

     <my:DataGrid Name="datagrid" 
                 AutoGenerateColumns="False" IsReadOnly="True" 
                 CanUserAddRows="False" CanUserDeleteRows="False" 
                 Background="White" 
                 KeyboardNavigation.TabNavigation="Once"
                 SelectionUnit="FullRow"> 
        <my:DataGrid.Columns> 
            <my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" ></my:DataGridTextColumn> 
            <my:DataGridTextColumn x:Name="Ticker" Header="Ticker" Width="1*">
                    <my:DataGridTextColumn.CellStyle>
                        <Style TargetType="{x:Type my:DataGridCell}">
                            <Setter Property="KeyboardNavigation.IsTabStop" Value="False"></Setter>
                        </Style>
                    </my:DataGridTextColumn.CellStyle>
            </my:DataGridTextColumn> 

            <my:DataGridTextColumn x:Name="OfficialName" Header="Name" Width="3*">
                  <my:DataGridTextColumn.CellStyle>
                        <Style TargetType="{x:Type my:DataGridCell}">
                            <Setter Property="KeyboardNavigation.IsTabStop" Value="False"></Setter>
                        </Style>
                  </my:DataGridTextColumn.CellStyle>
            </my:DataGridTextColumn> 
        </my:DataGrid.Columns> 
    </my:DataGrid>

故伎重演

  • SelectionUnit=“FullRow”使GUI看起来像是一次只做一行(就像我想要的那样)
  • 通过向我想要禁用TabStop-in的列添加CellStyle(但不包括在我想要停止的列中),我可以控制tab键将导航到哪些单元格。-KeyboardNavigation.TabNavigation在列上定义时不起作用

  • 我知道这是一个非常古老的问题,但我在这里发布这个,以防它对某人有所帮助。虽然公认的答案是好的,但我不认为它涵盖了在同一窗口上有另一个控件的情况,并且您希望从该控件进入
    DataGrid
    。此外,您可能需要原始问题中描述的行为(单制表符输入、单制表符输出、不通过单元格/列进行制表符切换)。该解决方案旨在实现这一目标

    注意:此解决方案假设您希望
    数据网格中的
    SelectionUnit
    FullRow

    首先,这里是应用于数据网格的
    样式

    <DataGrid.Resources>
        <Style TargetType="DataGridRow">
            <Style.Setters>
                <Setter Property="Focusable" Value="True"/>
            </Style.Setters>
            <Style.Triggers>
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="IsSelected" Value="True"/>
                </Trigger>
            </Style.Triggers>
        </Style>
        <Style TargetType="DataGridCell">
            <Style.Setters>
                <Setter Property="Focusable" Value="False"/>
            </Style.Setters>
        </Style>
    </DataGrid.Resources>
    

    使用这种方法,只要
    DataGrid
    接收到焦点,我仍然可以使用向上/向下箭头键在行之间循环,但是如果我想将焦点移动到选项卡顺序中的下一个控件,我仍然可以快速进行选项卡移出。

    这对我来说不是很有效,但很接近!当DataGrid中有多行时,第一次进入DataGrid将选择第一行,下一个选项卡将从DataGrid中移出。但是,如果您选择第二行和足够多的制表符以循环回到DataGrid,它将重新选择第一行。
    <DataGrid SelectionUnit="FullRow" KeyboardNavigation.TabNavigation="Once">