2010-05-03 3 views
7

J'ai 2 zone de texte dans le contrôle utilisateur WPF et le bouton sur le formulaire WPF. Comment puis-je accéder à ces valeur textbox sur le bouton cliquez sur l'événement de cette forme principale où j'utilise le contrôle utilisateur WPFAccéder à la valeur de contrôle utilisateur WPF

Répondre

8

tout d'abord, gardez à l'esprit que WPF n'est pas WinForms - en théorie vous devriez données liez vos TextBoxes aux propriétés, puis modifiez la valeur des propriétés, au lieu d'accéder directement aux TextBoxes!

Cela dit, tout ce que vous avez à faire est de nommer le UserControl et les zones de texte, puis d'y accéder, comme ceci:

Int MyUserControl.xaml:

<TextBox x:Name="myTextBox1"/> 
<TextBox x:Name="myTextBox2"/> 

En MyWindow.xaml:

<local:MyUserControl x:Name="myUserControlInstance"/> 
<Button Content="Click me" Click="Button_Click" /> 

En MyWindo w.xaml.cs:

private void Button_Click(object sender, RoutedEventArgs e) { 
    myUserControlInstance.myTextBox1.Text = "Foo"; 
    myUserControlInstance.myTextBox2.Text = "Bar"; 
} 
2

Dans le usercontrol, font deux propriétés publiques qui renvoient une chaîne:

public property Textbox1Text 
{ 
    get { return TextBox1.Text; } 
} 

alors le texte des contrôles de zone de texte est visible à la forme principale.

Ou une meilleure option: avoir un événement que l'usercontrol peut lever, appelez-le quelque chose comme TextChanged. Bien sûr, vous voulez un meilleur nom pour que cela, donc Feignons juste que votre première zone de texte est conçu pour l'utilisateur d'entrer un nom et appeler l'événement NameTextChanged, votre événement sera quelque chose comme ceci:

public MainWindow() 
{ 
    InitializeComponent(); 
    TextBox1.TextChanged += new TextChangedEventHandler(TextBox1_TextChanged); 
} 

private void TextBox1_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    if (NameTextChanged!= null) 
     this.NameTextChanged(this, e); 
} 

public event TextChangedEventHandler NameTextChanged; 

ou mieux encore, vous pourriez aller pour un événement routé - mais s'en tenir à l'essentiel en premier.

0

Abonner à un événement semble être une meilleure option comme suggéré par slugster ci-dessus. Si vous utilisez cette approche, vous pouvez avoir plusieurs instances du même contrôle utilisateur dans la même fenêtre, mais les gérer différemment en fonction du contrôle utilisateur dont elles proviennent. A titre d'exemple, vous pouvez avoir un contrôle d'utilisateur de type adresse qui peut avoir une adresse d'expéditeur et une adresse destinataire qui peuvent avoir les mêmes champs comme rue, ville, état etc. Mais peut se comporter différemment lorsque l'adresse expéditeur ou l'adresse destinataire est mise à jour.

Espérons que cela aide.

Nilesh Gule
http://nileshgule.blogspot.com

0

Pour votre problème, je peux vous proposer une solution spécifique. Cela ne peut pas être considéré comme général.

Votre problème est de lire le contenu des zones de texte dans votre contrôle utilisateur sur un clic de bouton.

Voici la solution.

Dans cette solution, il y aura deux fichiers XAML et leurs fichiers respectifs .cs.

Logic: - La logique inhérente est à itérer les ekements visuels dans le contrôle de l'utilisateur, trouver les zones de texte, lisez le texte sur le bouton clic.

Voici donc le code ...

  1. Window.xaml - Ceci est notre fenêtre principale. Cela contient 1 bouton et la référence d'objet du contrôle utilisateur.

    <Grid> 
        <StackPanel Orientation="Vertical"> 
         <Button x:Name="clickThis" 
           Height="30" 
           Width="70" 
           Content="Click Me!!" 
           Click="clickThis_Click" /> 
         <local:TxtBoxedUC x:Name="UC" /> 
        </StackPanel> 
    </Grid> 
    
  2. TxtBoxedUC.xaml - Ceci est notre contrôle utilisateur. Cela contient nos deux zones de texte.

    <Grid>   
        <StackPanel Orientation="Vertical"> 
         <TextBox x:Name="txt1" 
           Width="150" 
           Height="30" /> 
         <TextBox x:Name="txt2" 
           Width="150" 
           Height="30" /> 
        </StackPanel> 
    </Grid> 
    
  3. Window1.xaml.cs - Ce bouton contient la méthode de clic ainsi que la méthode pour itérer à travers les éléments visuels dans le contrôle de l'utilisateur.

    private void clickThis_Click(object sender, RoutedEventArgs e) 
    {    
        GetVisual(UC); 
    } 
    

Le code ci-dessus est de gérer le bouton clic.

private void GetVisual(UIElement currentVisual) 
    { 
     int count = VisualTreeHelper.GetChildrenCount(currentVisual); 
     if (count > 0) 
     { 
      for (int i = 0; i < count; i++) 
      { 
       UIElement uiElement = VisualTreeHelper.GetChild(currentVisual, i) as UIElement; 
       if (uiElement != null) 
       { 
        if (uiElement.GetType() == typeof(TextBox)) 
        { 
         TextBox txt = uiElement as TextBox; 
         MessageBox.Show(txt.Text); 

        } 
       } 
       GetVisual(uiElement); 
      } 
     } 
    } 

Le code ci-dessus consiste à parcourir les éléments visuels dans le contrôle utilisateur.

Le fichier .cs du contrôle utilisateur n'est pas nécessaire.

Maintenant, lorsque vous cliquez sur le bouton, vous pouvez voir waht vous avez entré dans le MessageBox.

codage heureux ...

S'il vous plaît marquer comme réponse si cela résout votre problème.

0

Essayez ceci:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    string myTextboxValue = this.tbInput.Text; 
} 
Questions connexes