2009-11-18 79 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

相關問題