2009-11-18 77 views
6

为什么在下面的例子中FindName()返回null为什么我无法通过名称使用FindName()访问文本框?

XAML:

<Window x:Class="TestDynamicTextBox343.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <Border > 

      <DockPanel x:Name="FormBase" LastChildFill="True"> 

      </DockPanel> 

     </Border> 

     <Button Content="Save" Click="Button_Click"/> 
    </StackPanel> 
</Window> 

代码背后:

using System; 
using System.Windows; 
using System.Windows.Controls; 

namespace TestDynamicTextBox343 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 


      StackPanel sp = new StackPanel(); 
      sp.Orientation = Orientation.Horizontal; 

      TextBlock textBlock = new TextBlock(); 
      textBlock.Text = "First Name: "; 

      TextBox textBox = new TextBox(); 
      textBox.Name = "FirstName"; 
      textBox.Text = "test"; 

      sp.Children.Add(textBlock); 
      sp.Children.Add(textBox); 
      FormBase.Children.Add(sp); 

     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      TextBox tb = (TextBox)this.FindName("FirstName"); 
      Console.WriteLine(tb.Text); 
     } 
    } 
} 

补遗答:

非常感谢,布鲁诺,运作良好。为了不添加相同的名称两次,我用这个包起来:

void RegisterTextBox(string textBoxName, TextBox textBox) 
{ 
    if ((TextBox)this.FindName(textBoxName) != null) 
     this.UnregisterName(textBoxName); 
    this.RegisterName(textBoxName, textBox); 
} 

或者,如果你将被登记除文本框之外的任何一个通用版本:

void RegisterControl<T>(string textBoxName, T textBox) 
{ 
    if ((T)this.FindName(textBoxName) != null) 
     this.UnregisterName(textBoxName); 
    this.RegisterName(textBoxName, textBox); 
} 

回答

15

这与WPF XAML Namescopes

因为您将元素添加到已分析的元素树中,所以您需要致电RegisterName

 ... 
     TextBox textBox = new TextBox(); 
     textBox.Name = "FirstName"; 
     textBox.Text = "test"; 

     this.RegisterName("FirstName", textBox); 
     ... 

添加元素,以解析的元 树木

任何添加到元素树 初始加载和处理 后必须调用用于 类定义XAML名称范围适当 实施RegisterName的。 否则,添加的对象不能通过 (如FindName)的名称引用 。仅设置 名称属性(或x:名称属性) 不会将该名称注册到任何 XAML名称范围内。将名称元素 添加到具有XAML 名称范围的元素树中也不会将 名称注册到XAML名称范围。虽然 XAML名称范围可以被嵌套,你 一般注册名称为XAML 名称范围存在的根 元素,让你的XAML名称范围 位置平行,将有在 相当于加载XAML页面被创建XAML名称范围 。开发人员应用 开发人员最常见的场景是 RegisterName将名称注册到页面的当前根 上的XAML名称范围的 。 RegisterName是 的一部分,用于查找 将以 动画形式运行的故事板。有关更多信息,请参阅 故事板概述。如果你打电话 RegisterName比 在同一个对象 树的根元素之外的元素上,这个名字仍然登记 最近的根元素,仿佛 你有 根元素称为RegisterName。

+1

我没有得到,如果我应该注册我想用FindName()函数找到的所有名称。我是不是该? – 2012-11-29 10:12:39

+0

@LorenzoSciuto只有你需要的那些,特别是那些将被动画定位的。 – Sabuncu 2014-11-13 20:33:55

相关问题