访问WPF用户控件值

时间:2010-05-03 10:59:43

标签: wpf user-controls

WPF用户控件中有2个文本框,WPF表单上有按钮。如何在我使用WPF用户控件的主窗体的按钮单击事件中访问这些文本框值

5 个答案:

答案 0 :(得分: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" />

MyWindow.xaml.cs

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

答案 1 :(得分:2)

在usercontrol中,创建两个返回字符串的公共属性:

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

然后文本框控件中的文本对主窗体可见。

或者更好的选择:有一个usercontrol可以引发的事件,称之为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;

或者更好的是,你可以去参加一个路由活动 - 但首先要坚持使用基础知识。

答案 2 :(得分:0)

如上面的slugster所示,订阅活动似乎是一个更好的选择。如果使用此方法,则可以在同一窗口中具有相同用户控件的多个实例,但根据它们源自哪个用户控件来区别对待它们。

作为示例,您可以使用地址类型用户控件,该控件可以具有发件人地址和接收者地址,这些地址可能具有相同的字段,例如街道,城市,州等。但是当发件人地址或收件人地址更新时,行为可能会有所不同。

希望这有帮助。

Nilesh Gule
http://nileshgule.blogspot.com

答案 3 :(得分:0)

针对您的具体问题,我可以为您推荐一个具体的解决方案。这不能被视为一般的。

您的问题是在点击按钮时阅读用户控件中文本框的内容。

以下是解决方案。

在此解决方案中,将有两个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.x​​aml - 这是我们的用户控件。这包含我们的两个文本框。

    <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);
    }
    
  4. 以上代码用于处理按钮单击。

    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中输入的内容。

    快乐的编码......

    如果这可以解决您的问题,请标记为答案。

答案 4 :(得分:0)

试试这个:

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