找不到应该存在的元素?

时间:2014-10-03 20:28:12

标签: 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 = stack;

tabControl.Items.Add(tab);

如您所见,它使用堆栈面板创建tabItem的标题。它增加了两个文本块;其中一个是空的,但我已经分配了名称" extra"。我想要做的是,稍后在代码中编辑名为" extra"的textBlock。并添加一些新文本。

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

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

4 个答案:

答案 0 :(得分:1)

FindName正是您要找的,但您的TextBlock不在正确的WPF Namescope中。

MSDN states

  

如果在解析生成该树的XAML之后的某个时间点向对象树添加对象,则新对象上的Name或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.FindResource("extra")返回null,因为在创建项目资源时该元素不存在。 More on FindResource.

答案 1 :(得分:0)

只需使用FrameworkElement.FindName方法:

var control = tab.FindName("extra");
if(control is TextBlock){
    // your logic here
}

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

答案 2 :(得分:-1)

因为您正在尝试使用密钥" extra"来查找资源。这是错的。

试试这个:

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实例访问它。

答案 3 :(得分:-2)

这里有一些你需要的VB WPF代码

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

我不知道它是否会像在C#WPF中那样工作,尽管如果这不起作用,请尝试查找CType