WPF:无法在具有嵌套TabControl的TabControl中选择第一个TabItem

8wtpewkr  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(398)

我遇到了WPF中嵌套TabControl的一个奇怪问题。
在我的主窗口中,我需要将一个TabControl放在另一个TabItem中,以便创建不同的菜单级别。由于我不需要默认选择TabItem,因此我使用TabControl.Loaded事件,如下所示:

private void TabControl_Loaded(object sender, RoutedEventArgs e)
    {
        ((TabControl)sender).SelectedItem = null;
    }

问题是:嵌套TabControl的第一个TabItem不可选,除非选择第二个TabItem,然后再次单击第一个标题。
我创建了一个示例项目来演示这个问题。
XAML:

<Window x:Class="TabControlTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TabControlTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TabControl Loaded="TabControl_Loaded">
            <TabItem>
                <TabItem.Header>
                    <Label Content="Menu 1" />
                </TabItem.Header>
                <Grid>
                    <TabControl Loaded="TabControl_Loaded">
                        <TabItem>
                            <TabItem.Header>
                                <Label Content="Sub-Menu 1" />
                            </TabItem.Header>
                            <Grid>
                                <Button Content="Button in subitem 1" Margin="82,131,553,89" />
                            </Grid>
                        </TabItem>
                        <TabItem>
                            <TabItem.Header>
                                <Label Content="Sub-Menu 2" />
                            </TabItem.Header>
                            <Grid>
                                <Button Content="Button in subitem 2" Margin="429,69,206,151" />
                            </Grid>
                        </TabItem>
                    </TabControl>
                </Grid>
            </TabItem>
            <TabItem>
                <TabItem.Header>
                    <Label Content="Menu 2" />
                </TabItem.Header>
                <Grid>
                    <Button Content="Button in Hello 2" Height="NaN" Margin="274,65,54,237" Width="NaN" />
                </Grid>
            </TabItem>
        </TabControl>
    </Grid>
</Window>

如果我禁用Loaded事件,则不会出现任何问题。
任何帮助都将不胜感激。
编辑:我在这里上传了示例项目。

6rqinv9w

6rqinv9w1#

除了处理Loaded事件之外,我相信您可以添加一个不可见的TabItem来防止第一个“真实的”选项卡在最初被选中:

<TabControl>
    <TabItem Visibility="Collapsed" />
    <TabItem>
        <TabItem.Header>
            <Label Content="Menu 1" />
        </TabItem.Header>
        <Grid>
            <TabControl>
                <TabItem Header="" Visibility="Collapsed" />
                <TabItem>
                    <TabItem.Header>
                        <Label Content="Sub-Menu 1" />
                    </TabItem.Header>
                    <Grid>
                        <Button Content="Button in subitem 1" Margin="82,131,553,89" />
                    </Grid>
                </TabItem>
                <TabItem>
                    <TabItem.Header>
                        <Label Content="Sub-Menu 2" />
                    </TabItem.Header>
                    <Grid>
                        <Button Content="Button in subitem 2" Margin="429,69,206,151" />
                    </Grid>
                </TabItem>
            </TabControl>
        </Grid>
    </TabItem>
    <TabItem>
        <TabItem.Header>
            <Label Content="Menu 2" />
        </TabItem.Header>
        <Grid>
            <Button Content="Button in Hello 2" Height="NaN" Margin="274,65,54,237" Width="NaN" />
        </Grid>
    </TabItem>
</TabControl>

另一种可能的解决方法是使用ItemsSource属性将TabControl绑定到源集合。

omtl5h9j

omtl5h9j2#

你可以处理window.contentrendered并在外部选项卡控件上将selectedindex设置为-1:

private void Window_ContentRendered(object sender, EventArgs e)
    {
        tc.SelectedIndex = -1;
    }

很明显,我将tabcontrol命名为tc:

<Grid>
    <TabControl x:Name="tc">
        <TabItem>

当我在外部选项卡控件上加载句柄时,同样的方法起作用。

private void tc_Loaded(object sender, RoutedEventArgs e)
    {
        tc.SelectedIndex = -1;
    }

相关问题