Доступ к значению пользовательского элемента управления WPF - PullRequest
8 голосов
/ 03 мая 2010

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

Ответы [ 5 ]

8 голосов
/ 03 мая 2010

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

Как говорится, все, что вам нужно сделать, это назвать 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" />

В MyWindow.xaml.cs :

private void Button_Click(object sender, RoutedEventArgs e) {
  myUserControlInstance.myTextBox1.Text = "Foo";
  myUserControlInstance.myTextBox2.Text = "Bar";
}
2 голосов
/ 03 мая 2010

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

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

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

Или лучший вариант: иметь событие, которое может вызвать пользовательский контроль, назвать его как 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 голосов
/ 04 апреля 2012

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

private void Button_Click(object sender, RoutedEventArgs e)
{
    string myTextboxValue = this.tbInput.Text;
}
0 голосов
/ 30 июля 2010

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

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

Вот решение.

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

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

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

  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 голосов
/ 21 июля 2010

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

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

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

Нилеш Гуле
http://nileshgule.blogspot.com

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