WPF FindName()没找到指定名称的元素

时间:2022-11-10 03:33:58

1.FindName()说明,可以用来获取已经注册名称的元素或标签

        //
// 摘要:
// 查找具有提供的标识符名的元素。
//
// 参数:
// name:
// 所请求元素的名称。
//
// 返回结果:
// 请求的元素。如果未找到匹配的元素,该值将为 null。
public object FindName(string name);

但是后台添加名称注册的方式是使用RegisterName(),而不是直接给Name赋值

        //
// 摘要:
// 提供一个可简化对 System.Windows.NameScope 注册方法访问的访问器。
//
// 参数:
// name:
// 要在指定的名称-对象映射中使用的名称。
//
// scopedElement:
// 映射的对象。
public void RegisterName(string name, object scopedElement);

举例说明:

1.直接赋值Name,无法通过FindName()查找到

//后台添加name 的元素
Label lbl1 = new Label();
lbl1.Content = "张三丰";
lbl1.Name = "lbl1"; //这样指定的无法通过FindName()查找到
panelOne.Children.Add(lbl1);
//查找后台添加的元素,没有找到
Label lbl1 = this.FindName("lbl1") as Label;
if (lbl1 != null)
{
MessageBox.Show(lbl1.Content.ToString());
}

2.使用RegisterName(),注册可以使用FindName()查找到

TextBlock block = new TextBlock();
block.Text = "海上生明月";
panelOne.RegisterName("block1", block); //将block命名block1名称注册到panelOne上
panelOne.Children.Add(block);
//从当前窗口获取,可以访问到
TextBlock block1 = btn1.FindName("block1") as TextBlock;
if (block1 != null)
{
MessageBox.Show(block1.Text);
}
//从Panel获取,可以访问到
TextBlock block2 = panelOne.FindName("block1") as TextBlock;
if (block2 != null)
{
MessageBox.Show("panelOne:"+block2.Text);
}