繁体   English   中英

找不到应该存在的元素?

[英]Can't find element that should exist?

我通过代码向我的标签控件添加标签:

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");

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

MSDN指出

如果在解析生成该树的XAML之后的某个时间点将对象添加到对象树中,则新对象上的Name或x:Name值不会自动更新XAML namescope中的信息。 若要在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,因为在创建项目资源时该元素不存在。 有关FindResource的更多信息。

只需使用FrameworkElement.FindName方法:

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

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

因为您正在尝试使用键“ 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实例到达它。

这是一些您需要的VB WPF代码

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM