C# 找不到应该存在的元素?

C# 找不到应该存在的元素?,c#,wpf,C#,Wpf,我正在通过以下代码将选项卡添加到选项卡控件: TabItem tab = new TabItem(); var stack = new StackPanel() { Orientation = Orientation.Horizontal }; stack.Children.Add(new TextBlock() { Text = header }); stack.Children.Add(new TextBlock() { Name = "extra" }); tab.Header = st

我正在通过以下代码将选项卡添加到选项卡控件:

TabItem tab = new TabItem();

var stack = new StackPanel() { Orientation = Orientation.Horizontal };
stack.Children.Add(new TextBlock() { Text = header });
stack.Children.Add(new TextBlock() { Name = "extra" });
tab.Header = stack;

tabControl.Items.Add(tab);
如您所见,它使用堆栈面板创建tabItem的标题。它添加了两个文本块;其中一个是空的,但我已经指定了额外的名称。我想做的是,在代码的后面,编辑名为extra的textBlock并向其中添加一些新文本

如何查找和编辑此元素?我尝试了以下代码,但产生了一个错误,表示找不到元素:

object test = Application.Current.FindResource("extra");

下面是一些VB WPF代码,以满足您的需要

    Dim test As TextBlock
    test = DirectCast(FindName("extra"), TextBlock)

我不知道它在C WPF中是否会像这样工作,尽管如果不起作用,请尝试查找CType,因为您正在尝试查找带有额外键的资源。这是错误的

试试这个:

TabItem tab = new TabItem();

var stack = new StackPanel() { Orientation = Orientation.Horizontal };
var textBlock = new TextBlock() { Name = "extra" }
stack.Children.Add(new TextBlock() { Text = header });
stack.Children.Add(textBlock);
tab.Header = stack;

tabControl.Items.Add(tab);
现在您可以使用textBlock实例访问它。

只需使用以下方法:

这里不需要Application.Current.Resource字典,因为它是不同的集合。如果您想使用它,那么您应该事先将用户控件放在资源字典中。

FindName是您要查找的内容,但您的文本块不在正确的WPF名称范围中

:

如果在解析生成对象树的XAML后的某个时间点将对象添加到对象树,则新对象上的名称或x:Name值不会自动更新XAML名称范围中的信息。要在加载XAML后将对象的名称添加到WPF XAML命名空间中,必须在定义XAML命名空间的对象上调用相应的RegisterName实现

例如:

var textBlock = new TextBlock() { Name = "extra" };
stack.Children.Add(textBlock );
RegisterName(textBlock);

...

TextBlock textBlock = FindName("extra") as TextBlock;

最后,Application.Current.FindResourceextra返回null,因为在创建项目资源时元素不存在

起初,tabControl可能不是一个,而是一个。为什么不通过get访问它?为什么这很重要?你认为我可以访问tab。代码正在用户控件中执行。选项卡项正在主窗口中构造。我可以访问tabControl,但不能访问tabItem本身。实际上,主窗口上也有FindName,额外的名称应该是该窗口的唯一名称。请尝试mainWindow.FindNameextra而不是tab.FindNameextra。FindNameextra不一样。不需要从codebehind访问XAML,因为您正在codebehind中添加元素。您已经有了实例,可以使用它们。只是把它们赋给了一个变量。
var textBlock = new TextBlock() { Name = "extra" };
stack.Children.Add(textBlock );
RegisterName(textBlock);

...

TextBlock textBlock = FindName("extra") as TextBlock;