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