如何在WPF TabControl中用程序更改选项卡名称

本文关键字:选项 程序 WPF TabControl | 更新日期: 2023-09-27 18:20:41

全部,

我在这里广泛搜索了解决方案,但我觉得我的问题源于对WPF基本缺乏了解。我是新手,到目前为止,我已经尽我所能在谷歌上进行了黑客攻击和搜索。

基本上,我有一个与TabControl动态交互的Ribbon。功能区选项卡选择一个项目类别,RibbonGroups中的MenuItems然后选择该类别中的一个项目。单击项目后,TabControl上的选项卡需要动态更改。无论是标题、选项卡本身还是整个TabControl,我都很满意。到目前为止,在单击其中一个RibbonGroup内部的MenuItem时,我尝试将TabControl上每个选项卡的标题文本设置为"blah"。然后Header对象抛出一个空指针。无论是设置Header、Tabs还是TabControl本身,都会发生这种情况。

为什么?!?!?!?

我到底该怎么修???

谢谢!

如何在WPF TabControl中用程序更改选项卡名称

WPF的设计考虑到了数据/UI分离。你很难找到解决方案的原因之一是,你试图做的是"不";您不应该以编程方式更改UI的标题文本,而应该更改底层数据,并允许WPF管道更新数据的显示方式。

WPF选项卡控件可以包含任何类型的对象;你可以用整数、字符串、FooBars或其他任何东西来填充它。不能保证这些对象中的任何一个都会定义Header属性,而是由开发人员来配置数据绑定或模板,以指示TabControl如何显示FooBar或其他内容。

在一个符合MVVM设计模式的理想WPF应用程序中,您可能会将TabControl绑定到一组视图模型,每个视图模型定义一个HeaderText属性。视图模型将实现INotifyPropertyChanged接口,这样当视图模型上的HeaderText属性发生更改时,UI就会得到更新。

话虽如此,如果您有一个现有的应用程序,那么使用不同的设计模式从头开始重写它可能是不现实的,而且MVVM不容易添加到现有的代码库中。如果您在不使用任何数据绑定的情况下使用简单的设计器生成的UI,那么下面的代码将满足您的要求。有时

foreach(TabItem item in tabControl.Items)
    item.Header = "blah";

但正如我之前所说,不能保证WPF TabControl的Items集合将包含TabItem类型的项,因此此代码是不安全的。

虽然RogerN的答案可能是更好的答案,但这里有一个代码示例,它可以更改选项卡上显示的文本:

XAML:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TabControl Name="MyTabControl">
        <TabItem Header="Tab One">
            <TextBlock Text="This is tab #1." />
        </TabItem>
        <TabItem Header="Tab Two">
            <TextBlock Text="This is tab #2." />
        </TabItem>
        <TabItem Header="Tab Three">
            <TextBlock Text="This is tab #3." />
        </TabItem>
    </TabControl>
    <Button Grid.Row="1" Content="Change Tab" Name="ChangeButton" Click="ChangeButton_Click" />
</Grid>

代码背后:

public partial class MainWindow : Window {
    public MainWindow() {
        InitializeComponent();
    }
    private void ChangeButton_Click(object sender, RoutedEventArgs e) {
        ((TabItem)MyTabControl.Items[0]).Header = "Changed!";
    }
}

尝试将其绑定到代码中的列表,如下所示:

private List<TabItem> TabItems = new List<TabItem>()
{
    "Item1",
    "Item2",
    "Item3"
};
tabcontrol1.ItemSource = TabItems;

然后在您想要更改选项卡控件中的项目时重新绑定它。通过这种方式,您可以动态更改名称并添加更多选项卡项。在执行此操作时,您必须使用TabItem.Content属性以编程方式添加控件。