WPF用户控件中有2个文本框,WPF表单上有按钮。如何在我使用WPF用户控件的主窗体的按钮单击事件中访问这些文本框值
答案 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文件。
逻辑: - 固有的逻辑是迭代用户控件中的视觉元素,找到文本框,在按钮点击时读取文本框。
所以这是代码......
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>
TxtBoxedUC.xaml - 这是我们的用户控件。这包含我们的两个文本框。
<Grid>
<StackPanel Orientation="Vertical">
<TextBox x:Name="txt1"
Width="150"
Height="30" />
<TextBox x:Name="txt2"
Width="150"
Height="30" />
</StackPanel>
</Grid>
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中输入的内容。
快乐的编码......
如果这可以解决您的问题,请标记为答案。
答案 4 :(得分:0)
试试这个:
private void Button_Click(object sender, RoutedEventArgs e)
{
string myTextboxValue = this.tbInput.Text;
}