首页 > 解决方案 > 托管 DataGrid 时 WPF TabControl 无法切换选项卡

问题描述

默认情况下TabControl,您可以使用Ctrl+切换选项卡Tab,但是如果其中一个选项卡包含DataGrid它,则全部中断。例如,如果我有一个TabControl只包含文本框的简单对象:

<TabControl>
    <TabItem Header="Tab1">
        <TextBox/>
    </TabItem>
    <TabItem Header="Tab2">
        <TextBox/>
    </TabItem>
    <TabItem Header="Tab3">
        <TextBox/>
    </TabItem>
</TabControl>

并反复按Ctrl+ Tab,当前 Tab 将循环:

Tab1 > Tab2 > Tab3 > Tab1 > ...等

但是如果我将几乎任何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会卡住无法通过所说的选项卡:

Tab1 > Tab2 > Tab1 > Tab2 > ...等

我该如何解决这个问题?


我已经尝试IsTabStop="False"DataGrid和几个KeyBoardNavigation属性组合,所有这些都没有效果或适得其反。


编辑(2):问题似乎主要出现在DataGrid是 的第一个可聚焦子项时TabItem,例如内容:

<StackPanel>
    <TextBox/>
    <DataGrid ItemsSource="{StaticResource Items}"/>
</StackPanel>

几乎可以工作,直到用户选择DataGrid. 如果选择了下一个网格Ctrl+Tab则返回到第一个选项卡而不是下一个选项卡。

标签: c#wpfdatagridtabcontrol

解决方案


看起来这是一个焦点问题,当Datagrid获得焦点时,它会从 中丢失TabControl,因此每当按下 ctrl/tab 时,以编程方式设置焦点DataGrid

 <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();
        }
    }

推荐阅读