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

问题描述 投票:0回答:2

在默认的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"DataGridKeyBoardNavigation属性的几种组合,所有这些都不起作用或起反作用。


Edit(2):这个问题似乎主要是在DataGridTabItemfirst可聚焦子元素时出现的,例如content:

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

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

c# wpf datagrid tabcontrol
2个回答
1
投票
看起来像是一个焦点问题,当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(); } }


0
投票
您是否尝试过

IsTabStop="False"

在您的控件上。这样可以防止将注意力集中到该控件上吗?用户仍然可以手动单击网格以获取焦点(或其他控件),但是如果没有这样做,它将忽略试图使该控件获得焦点。

仅在IsTabStop上进行扩展,您可能希望尝试将其包装到用户控件中并在用户控件处停止,以使其不会进入任何内容,例如...

<UserControl IsTabStop="false"> <DataGrid> … </DataGrid> </UserControl>

© www.soinside.com 2019 - 2024. All rights reserved.