我有一个包含多列的 WPF Toolkit 数据网格。我正在尝试获得一种行为,您可以使用选项卡进入网格,然后使用单个选项卡再次退出。例如。我不想通过选项卡浏览网格的所有列或单元格,只需一次进入,一次退出。

有没有一个简单的解决方案,我尝试将 TabNavigation 设置为 Once,同时禁用 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的设置KeyboardNavigation不起作用。应工作的替代方法是建立一个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将确保的细胞是只接受tab如果已经选择了它。然而,如果要选择满行和不具有对数据网格SelectionUnit =“小区”集,它将仍然通过当前选择的行的每一列循环。

相反,我们可以创建多个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并关闭接受tab,和键控样式,允许选择被选择的小区(或者整行)时。运用这种风格只有一个字段会给我们相同的单选项卡,在效果,同时允许它的列的全行所有被选中。

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

这的确也停止互联到DataGrid中如果没有被选中,这可以根据使用的是它的情况是优选的或不

其他提示

谢谢你,莫尔。为了使列的制表位禁用,我接受了您的答案并稍作修改;

     <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>

所以技巧;

  1. SelectionUnit="FullRow" 使 GUI 看起来就像一次一行地执行操作(就像我想要的那样)。
  2. 通过将 CellStyle 添加到我想要禁用 TabStop 的列(但不将其包含在我想要停止的列中),我可以控制 Tab 键将导航到哪些单元格。- 在列上定义时,KeyboardNavigation.TabNavigation 没有效果。

我知道这是一个非常古老的问题,但我在这里的情况下张贴这也可以帮助别人。虽然接受的答案是好的,我不相信它涵盖了那里的同一窗口上的另一个控制的情况下,你想卡口从控制DataGrid。此外,如在原来的问题(在单选项卡,单卡销,通过细胞/列没有黏合)描述,您可能希望行为。该解决方案的目的是实现这一点。

注意::此解决方案是假设你希望你的SelectionUnitFullRowDataGrid

首先,这里是应用到StyleDataGrid

<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>

此样式允许上行焦点,但防止专注于单个细胞,其保持与SelectionUnitFullRow一致的焦点。这种风格内的触发设置是可选的 - 如果你想,当它接收焦点自动选择该行就只需要

在我的情况下,我想在/标签出行为单选项卡,所以也设置在我的KeyboardNavigation.TabNavigation属性DataGrid =“一旦”

<DataGrid SelectionUnit="FullRow" KeyboardNavigation.TabNavigation="Once">

通过这种方法,我仍然可以使用的升/行向下箭头键循环一旦DataGrid接收焦点,但我仍能标签拖出迅速,如果我想将焦点移到Tab键顺序的下一个控件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top