Pourquoi ne puis-je pas accéder à une zone de texte par Nom avec FindName ()?

Pourquoi FindName () renvoie-t-il la valeur null dans l’exemple suivant?

XAML:

      

Code Derrière:

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

Addenda à la réponse:

Merci beaucoup, Bruno, ça a bien fonctionné. Afin de ne pas append le même nom deux fois, je l’enveloppe avec ceci:

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

Ou si vous voulez enregistrer autre chose que des TextBox, une version générique:

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

Ceci est lié aux zones de noms WPF XAML .

Comme vous ajoutez des éléments aux arbres d’éléments analysés, vous devez appeler RegisterName .

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

Ajout d’éléments à des arbres d’éléments analysés

Tout ajout à l’arborescence des éléments après le chargement et le traitement initiaux doit appeler l’implémentation appropriée de RegisterName pour la classe qui définit le namescope XAML. Sinon, l’object ajouté ne peut pas être référencé par son nom via des méthodes telles que FindName. Le simple fait de définir une propriété Name (ou l’atsortingbut x: Name) n’enregistre pas ce nom dans aucun nom de domaine XAML. L’ajout d’un élément nommé à une arborescence d’éléments ayant un namescope XAML n’enregistre pas non plus le nom dans le namescope XAML. Bien que les champs de noms XAML puissent être nesteds, vous enregistrez généralement les noms sur le champ de noms XAML existant sur l’élément racine, de sorte que l’emplacement de votre champ de noms XAML soit parallèle à celui du nom XAML qui aurait été créé dans une page XAML chargée équivalente. Le scénario le plus courant pour les développeurs d’applications est l’utilisation de RegisterName pour enregistrer des noms dans l’étendue de nom XAML à la racine actuelle de la page. RegisterName fait partie d’un scénario important pour la recherche de storyboards exécutés sous forme d’animations. Pour plus d’informations, voir Vue d’ensemble des storyboards. Si vous appelez RegisterName sur un élément autre que l’élément racine de la même arborescence d’objects, le nom est toujours enregistré sur l’élément le plus proche de la racine, comme si vous aviez appelé RegisterName sur l’élément racine.