在默认的TabControl
中,您可以使用Ctrl + Tab切换选项卡,但是,如果其中一个选项卡包含DataGrid
,则所有选项卡都将中断。例如,如果我有一个简单的TabControl
,只包含TextBoxes:
<TabControl>
<TabItem Header="Tab1">
<TextBox/>
</TabItem>
<TabItem Header="Tab2">
<TextBox/>
</TabItem>
<TabItem Header="Tab3">
<TextBox/>
</TabItem>
</TabControl>
并反复按Ctrl + Tab,当前的Tab将循环:
Tab1> Tab2> Tab3> Tab1> ... etc
但是如果我实际上将任何DataGrid
放在中间的一个标签中,例如:
...
<TabItem Header="Tab2"> <!--replacing 2nd tab content-->
<TabItem.Resources>
<x:Array x:Key="Items" Type="{x:Type Run}">
<Run Text="Foo"/>
<Run Text="Bar"/>
<Run Text="Baz"/>
</x:Array>
</TabItem.Resources>
<DataGrid ItemsSource="{StaticResource Items}"/>
</TabItem>
Ctrl + Tab会卡住,无法越过所说的Tab:
Tab1> Tab2> Tab1> Tab2> ... etc
如何解决此问题?
我已经尝试过IsTabStop="False"
的DataGrid
和KeyBoardNavigation
属性的几种组合,所有这些都不起作用或起反作用。
Edit(2):这个问题似乎主要是在DataGrid
是TabItem
的first可聚焦子元素时出现的,例如content:
<StackPanel>
<TextBox/>
<DataGrid ItemsSource="{StaticResource Items}"/>
</StackPanel>
几乎起作用,直到用户选择DataGrid
。如果选择了网格,则下一个[[Ctrl + Tab将返回第一个选项卡,而不是下一个。
Datagrid
获得焦点时,它会从TabControl
中丢失,因此,只要在按下DataGrid
的位置按下ctrl / tab,就可以通过编程方式设置该焦点: <TabControl x:Name="TabCtrl">
<TabItem Header="Tab1" x:Name="Tab1" >
<TextBox/>
</TabItem>
<TabItem Header="Tab3" x:Name="Tab2" PreviewKeyDown="UIElement_OnPreviewKeyDown">
<TabItem.Resources>
<x:Array x:Key="Items" Type="{x:Type Run}">
<Run Text="Foo"/>
<Run Text="Bar"/>
<Run Text="Baz"/>
</x:Array>
</TabItem.Resources>
<DataGrid ItemsSource="{StaticResource Items}" />
</TabItem>
<TabItem Header="Tab2" x:Name="Tab3">
<TextBox/>
</TabItem>
</TabControl>
处理程序:
private void UIElement_OnPreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Tab && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control && sender is TabItem) { TabCtrl.Focus(); } }
IsTabStop="False"
在您的控件上。这样可以防止将注意力集中到该控件上吗?用户仍然可以手动单击网格以获取焦点(或其他控件),但是如果没有这样做,它将忽略试图使该控件获得焦点。仅在IsTabStop上进行扩展,您可能希望尝试将其包装到用户控件中并在用户控件处停止,以使其不会进入任何内容,例如...
<UserControl IsTabStop="false"> <DataGrid> … </DataGrid> </UserControl>