簡體   English   中英

WPF:不能 select 嵌套 TabControl 的 TabControl 中的第一個 TabItem

[英]WPF: Can not select first TabItem in TabControl with nested TabControls

我在 WPF 中遇到嵌套 TabControl 的奇怪問題。

在我的主頁 Window 中,我需要將一個 TabControl 放在另一個 TabItem 中,以創建不同的菜單級別。 由於我不需要默認選擇的 TabItem,因此我使用TabControl.Loaded事件,如下所示:

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

問題是:嵌套 TabControl 的第一個 TabItem 是不可選擇的,除非選擇第二個然后再次單擊第一個 header。

我創建了一個示例項目來演示該問題。

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事件,則沒有問題。

任何幫助,將不勝感激。

編輯:我在這里上傳了示例項目。

我相信您可以添加一個不可見的TabItem來防止最初選擇第一個“真實”選項卡,而不是處理Loaded事件:

<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綁定到源集合。

您可以處理 window.contentrendered 並在外部選項卡控件上將 selectedindex 設置為 -1:

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

顯然,我已將 tabcontrol tc 命名為:

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

當我處理加載到外部 tabcontrol 上時,同樣的方法有效。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM