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;