如何在C#中按名称查找动态创建的XAML组件?

时间:2015-02-08 11:25:25

标签: c# wpf xaml

如何在C#中按名称查找动态创建的XAML组件?

我创建了下一个按钮并将其放入堆栈面板。

var nextButton = new Button();
nextButton.Name = "NextBtn";
next.Children.Add(nextButton);

然后尝试用

找到它
this.FindName("NextBtn")

它始终为空。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

使用RegisterName代替nextButton.Name = "NextBtn";

var nextButton = new Button();
RegisterName("NextBtn", nextButton);
next.Children.Add(nextButton);

然后您可以通过以下方式找到它:

this.FindName("NextBtn")

答案 1 :(得分:0)

您可以手动找到该按钮,例如:

foreach (var child in next.Children)
{
    if (child is Button && (child as Button).Name == "NextBtn")
        ;// do what you want with this child
}

或者:

var btn = next.Children.OfType<Button>().FirstOrDefault(q => q.Name == "NextBtn");
if (btn != null)
    ;// do what you want

答案 2 :(得分:0)

正如Farhad Jabiyev所说,我创建了副本。

作为相关问题(FindName returning null)解释

来自此页https://msdn.microsoft.com/en-us/library/ms746659.aspx

  

初始加载和处理后对元素树的任何添加   必须为该类调用RegisterName的相应实现   它定义了XAML名称范围。否则,添加的对象不能   通过FindName等方法按名称引用。仅仅设置一个   Name属性(或x:Name Attribute)不会将该名称注册到   任何XAML名称范围。