选项卡控件默认选择第一个选项卡

12

我不确定这是否只是默认的WPF选项卡控件行为,或者是否有一种方法可以禁用它。

我定义了一个如下所示的选项卡控件:

<TabControl TabStripPlacement="Left"
            Background="Transparent" 
            ItemsSource="{Binding Path=AvailableProducts}"
            SelectedValuePath="Name"
            SelectedValue="{Binding Path=SelectedProduct, Mode=TwoWay}">

AvailableProducts是产品列表,例如:

Foo
Bar
Baz

最初,SelectedProduct是null,但当选项卡控件显示时,它已经自动选择了Foo。我想要的是没有选定任何选项卡。

选项卡控件是否总是选择第一个选项卡?

更新

我添加了一些示例代码,以展示我所描述的内容。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TabControl SelectedIndex="1">
            <TabItem Header="TAB 1">
                <Button>TEST</Button>
            </TabItem>
            <TabItem Header="TAB 2">
                <TabControl TabStripPlacement="Left"
                            Background="Transparent" 
                            ItemsSource="{Binding Path=AvailableProducts}"
                            SelectedValuePath="Name"
                            SelectedValue="{Binding Path=SelectedProduct, Mode=TwoWay}"/>
            </TabItem>
        </TabControl>
    </Grid>
</Window>




using System.Collections.Generic;

namespace WpfApplication1
{
    public partial class MainWindow
    {
        private List<Product> _availableProducts = new List<Product>();

        public MainWindow()
        {
            SelectedProduct = null;
            InitializeComponent();
            _availableProducts.Add(new Product("Foo"));
            _availableProducts.Add(new Product("Bar"));
            _availableProducts.Add(new Product("Baz"));

            DataContext = this;
        }

        public List<Product> AvailableProducts
        {
            get
            {
                return _availableProducts;
            }
        }

        public string SelectedProduct { get; set; }
    }

    public class Product
    {
        public Product(string name)
        {
            Name = name;
        }

        public string Name { get; set; }

        public override string ToString()
        {
            return Name;
        }
    }
}
如果您运行上述代码,应用程序将以“TAB 2”显示,并且未选择标签 Foo/Bar/Baz 中的任何一个。但是,如果您更改
<TabControl SelectedIndex="1">

<TabControl SelectedIndex="0">

运行该应用程序时,它会从“TAB 1”开始。当您切换到“TAB 2”时,第一个选项卡(Foo)将被选中。

我不明白为什么如果您从“TAB 2”开始,它会按照我的期望工作,但是如果您从“TAB 1”开始然后切换到“TAB 2”,就会默认选择一个选项卡。


即使您将SelectedIndex设置为-1,第一个TabItem仍然是活动状态。也许可以考虑使用另一种允许空选择的控件,如ListBox或Compbox。 - paparazzo
我在一个示例应用程序中尝试了您的代码,但是对我来说默认情况下没有选择任何内容。我甚至添加了一个触发器,在选择某个项目时更改TabItem的背景。当启动应用程序时,我没有看到任何选项卡项的背景更改,并且只有在显式选择选项卡项时才会更改背景。当您说“Foo”默认选中时,您是否在TabContent面板中看到了“Foo”的内容? - Suresh
@sthotakura,我已经更新了我的问题,并提供了我测试的示例应用程序。当您在另一个选项卡控件中有一个选项卡控件时,似乎会发生这种情况。 - Flack
啊,我现在明白问题了 :( - Suresh
你尝试过将SelectedIndex设置为-1吗? - Mayur Dhingra
3个回答

3

我遇到了同样的问题。我知道这是一个老问题,但我想在这里留下答案给未来的自己。

通过xaml使用loaded事件:

<TabControl Loaded="SheetTabs_Loaded"></TabControl>

在".xaml.cs"中创建方法:
private void SheetTabs_Loaded(object sender, RoutedEventArgs e)
{
    var tabControl = (TabControl)sender;
    tabControl.SelectedIndex = 0;
}

3

截至NET5.0,它似乎可以与以下内容一起使用:

<TabControl SelectedIndex="0">
...
</TabControl>

但是当我也使用SelectedItem时,它没有起作用。只有使用“空白”的SelectedIndex时,它才能正常工作。

-3

选项卡控件始终显示其中一个选项卡的内容,因此如果您没有明确告诉它要显示哪个选项卡,它将使用第一个选项卡。您不能让它不显示任何选项卡。

您可以尝试隐藏/禁用选项卡/选项卡控件,直到选择了产品。


4
谢谢。我已更新原帖并添加了一个小示例应用程序,以重现我所描述的情况。看起来有时候标签控件可能没有选择任何选项卡。 - Flack
我也遇到过默认情况下没有选择选项卡的选项卡控件。 - dennis_ler
默认情况下,没有选中任何选项卡。 - Welcor
您可以取消选择选项卡控件项目,这将使其内容为空白:https://stackoverflow.com/a/59106672/7212563 - Arthur Khazbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接