2010-05-03 3 views
7

У меня есть текстовое поле в пользовательском элементе управления WPF и кнопка в форме WPF. Как я могу получить доступ к этим значение текстового поля на кнопку мыши события этой основной формы, где я использую пользовательский элемент управления WPFДоступ к пользовательскому значению пользователя WPF

ответ

8

Прежде всего, иметь в виду, что WPF не WinForms - в теории вы должны данные привяжите к вашим свойствам TextBoxes, а затем измените значение свойств, а не напрямую на TextBoxes!

Это, как говорится, все, что вам нужно сделать, это назвать UserControl и TextBoxes, а затем получить доступ к ним, как это:

Int MyUserControl.xaml:

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

В MyWindow.xaml:

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

В MyWindo w.xaml.cs:

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

В UserControl, сделать два открытых свойства, которые возвращают строку:

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

затем текст из элементов управления TextBox является видимым для главной формы.

Или лучший вариант: иметь событие, которое пользовательское управление может поднять, назовите его чем-то вроде TextChanged. Конечно, вы хотите лучшее название для него, чем это, так что давайте просто делать вид, что ваше первое текстовое поле предназначено для пользователя ввести имя и вызвать событие NameTextChanged, то ваше мероприятие будет что-то вроде этого:

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; 

или еще лучше, вы могли бы пойти на разгромленное событие - но сначала придерживайтесь основ.

0

Подписывание событию, по-видимому, является лучшим вариантом, предложенным slugster выше. Если вы используете этот подход, вы можете иметь несколько экземпляров одного и того же элемента управления пользователя в том же окне, но обрабатывать их по-разному, основываясь на том, с какого пользовательского элемента управления они происходят.

В качестве примера вы можете использовать пользовательский контроль типа адреса, который может иметь адрес отправителя и адрес получателя, который может иметь одинаковые поля, такие как улица, город, штат и т. Д. Но может вести себя по-другому, когда адрес отправителя или адрес получателя обновляются.

Надеюсь, это поможет.

Nilesh Gule
http://nileshgule.blogspot.com

0

Для вашей конкретной проблемы, я могу предложить вам конкретное решение. Это нельзя рассматривать как общий.

Ваша проблема заключается в том, чтобы прочитать содержимое текстовых полей в пользовательском элементе управления нажатием кнопки.

Вот решение.

В этом решении будет два файла xaml и их соответствующие файлы .cs.

Logic: - Врожденная логика заключается в повторении визуальных эффектов в пользовательском элементе управления, поиске текстовых полей, чтении текста в нем при нажатии кнопки.

Так вот код ...

  1. Window.xaml - Это наше главное окно. Это содержит 1 кнопку и ссылку на объект для пользовательского элемента управления.

    <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 - Это наш пользовательский элемент управления. Это содержит два наших текстовых поля.

    <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 - Этот документ содержит кнопку метод щелчка, а также методы перебора визуальных элементов в пользовательском элементе управления.

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

выше код для обработки нажатия кнопок.

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

Выше код предназначен для итерации визуальных элементов в пользовательском элементе управления.

Файл .cs пользовательского элемента управления не требуется.

Теперь, когда вы нажимаете на кнопку, вы можете видеть, что вы вошли в MessageBox.

Счастливое кодирование ...

Пожалуйста, отметьте, как ответ, если это решит вашу проблему.

0

Попробуйте это:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    string myTextboxValue = this.tbInput.Text; 
} 
Смежные вопросы