2009-11-18 21 views
6

Neden aşağıdaki örnekte FindName()null nolu döndürür?Neden bir TextBox'a FindName() ile İsme erişemiyorum?

XAML: Arkasında

<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> 

Kodu:

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

Zeyilname Yanıt:

Teşekkür iyi çalıştı çok Bruno,. Eğer metin kutularının dışında başka bir şey kayıt edilecektir, genel bir versiyonunu

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

Veya:

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

cevap

15

Bu WPF XAML Namescopes ilişkilidir iki kez aynı adı eklemek etmemek için, bu ile sarın .

Öğeleri ayrıştırılmış ağaçlara eklerseniz, RegisterName numaralı telefonu aramanız gerekir. Ağaçlar

XAML namescope tanımlar sınıf RegisterName uygun uygulama çağırmalıdır ilk yükleme ve işlem sonra element ağacı için herhangi bir ilave

Parçalar halinde Element Elements ekleme

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

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

. Aksi takdirde, eklenen nesne, FindName gibi yöntemleriyle isimleriyle başvurulan olamaz. Sadece Name özelliği (veya x: Name Attribute) ayarı bu adı XAML namescope'a kaydetmez. Bir XAML adkopuruna sahip bir eleman ağacına adlı bir adlandırılmış öğe eklemek de adını XAML adkopuna kaydetmez. XAML namescopes iç içe olmasına rağmen, genellikle, kök eleman bulunduğunu XAML namescope İsimleri kayıt konumu bir eşdeğer yüklü XAML sayfada oluşturulmuş olurdu XAML namescope paralellik XAML namescope böylece . Uygulama geliştiricileri için en sık kullanılan ortak senaryosu, KayıtAdı'nı, sayfanın geçerli kökündeki üzerindeki XAML nameskopuna kaydetmek için kullanacağınızdır. RegisterName, 'un animasyonları olarak çalışacak storyboard'larını bulmak için önemli bir senaryodur. Daha fazla bilgi için, bkz. Storyboards Genel Bakış. Eğer aynı nesne ağacındaki kök öğesi dışında bir element üzerinde RegisterName ararsanız kök elemanı üzerinde RegisterName aramıştı sanki adı hala Kökten en yakın eleman kaydedilir.

+1

FindName() işleviyle bulmak istediğim tüm adları kaydetmem gerekirse alamadım. Yapmalımıyım? –

+0

@LorenzoSciuto Yalnızca ihtiyacınız olan ve özellikle animasyon tarafından hedeflenenler. – Sabuncu

İlgili konular