2009-11-18 13 views
6

क्यों FindName() निम्न उदाहरण में शून्य क्यों देता है?मैं 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 namescope को परिभाषित करता है के लिए RegisterName के कार्यान्वयन कॉल करना होगा पार्स किया गया तत्व को तत्वों को जोड़ने । अन्यथा, जोड़ा गया ऑब्जेक्ट हो सकता है जो नाम जैसे FindName के माध्यम से नाम से संदर्भित हो। केवल नाम संपत्ति (या x: नाम विशेषता) उस नाम को किसी भी XAML नेमस्कोप में पंजीकृत नहीं करता है। XAML नामकपणी वाले तत्व पेड़ में नामित तत्व जोड़ना नामांकन भी नाम XAML नामस्थान में पंजीकृत नहीं करता है। हालांकि XAML namescopes नेस्ट किया जा सकता है, तो आप आम तौर पर नाम XAML namescope कि जड़ तत्व पर मौजूद है, रजिस्टर ताकि आपके XAML namescope स्थान XAML namescope होता है कि एक बराबर लोड XAML पेज में बनाया गया है समानताएं । आवेदन अनुप्रयोग डेवलपर्स के लिए सामान्य परिदृश्य यह है कि आप रजिस्टर नाम का उपयोग में नाम पंजीकृत करने के लिए पृष्ठ के वर्तमान रूट पर XAML नेमस्कोप का उपयोग करेंगे। स्टोरीबोर्ड खोजने के लिए रजिस्टर नाम का एक महत्वपूर्ण परिदृश्य है जो एनिमेशन के रूप में चलाएगा। अधिक जानकारी के लिए, स्टोरीबोर्ड अवलोकन देखें। आप एक ही वस्तु पेड़ में मूल तत्व के अलावा अन्य एक तत्व पर RegisterName कॉल करते हैं, नाम अभी भी के लिए रूट निकटतम तत्व, पंजीकृत के रूप में अगर आप मूल तत्व पर RegisterName बुलाया था है।

+1

मुझे नहीं मिला कि मुझे उन सभी नामों को पंजीकृत करना चाहिए जिन्हें मैं FindName() फ़ंक्शन के साथ ढूंढना चाहता हूं। क्या मैं? –

+0

@LorenzoSciuto केवल वही जिन्हें आप चाहते हैं, और विशेष रूप से उन लोगों को जिन्हें एनीमेशन द्वारा लक्षित किया जाएगा। – Sabuncu

संबंधित मुद्दे