承载DataGrid时,WPF TabControl无法切换选项卡

在默认的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,所有这些都不起作用或起反作用。


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

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

几乎有效,直到用户选择DataGrid。如果选择了网格,则下一个 Ctrl + Tab 会返回到第一个选项卡,而不是下一个。

wolaiwen_0 回答:承载DataGrid时,WPF TabControl无法切换选项卡

看起来像是一个焦点问题,当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>
本文链接:https://www.f2er.com/3110239.html

大家都在问