[英]How to programmatically select a TabItem in WPF TabControl
[英]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.