我有2个文本框中的WPF用户控件和WPF窗体上的按钮。我如何才能访问那些文本框的按钮单击事件的主窗体,我使用的WPF用户控件
9vw9lbht1#
首先,请记住WPF不是WinForms-理论上您应该将TextBox数据绑定到属性,然后更改属性的值,而不是直接访问TextBox!也就是说,你所要做的就是命名UserControl和TextBox,然后访问它们,就像这样:
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"; }
aydmsdu92#
在usercontrol中,创建两个返回字符串的公共属性:
public property Textbox1Text { get { return TextBox1.Text; } }
则来自文本框控件的文本对主窗体可见。或者更好的选择:如果有一个用户控件可以引发的事件,请将其命名为TextChanged。当然,你想要一个更好的名字,所以让我们假设你的第一个文本框是为用户输入一个名字并调用事件NameTextChanged而设计的,那么你的事件将是这样的:
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;
或者更好的是,你可以选择一个路由事件-但首先要坚持基本的。
6tdlim6h3#
订阅一个事件似乎是一个更好的选择,正如上面的slugster所建议的那样。如果使用此方法,则可以在同一窗口中具有同一用户控件的多个示例,但可以根据它们源自哪个用户控件来对它们进行不同的处理。作为一个例子,你可以有地址类型的用户控件,可以有发件人地址和收件人地址,可能有相同的字段,如街道,城市,州等。但是当发送方地址或接收方地址被更新时可以有不同的行为。希望这能帮上忙。尼莱什·古莱http://nileshgule.blogspot.com
uklbhaso4#
对于你的具体问题,我可以给你一个具体的解决方案。这不能被视为一个普遍的问题。您的问题是在单击按钮时读取用户控件中文本框的内容。
解决方案如下
在这个解决方案中,将有两个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>
1.TxtBoxedUC.xaml-这是我们的用户控件。这包含我们的两个文本框。
<Grid> <StackPanel Orientation="Vertical"> <TextBox x:Name="txt1" Width="150" Height="30" /> <TextBox x:Name="txt2" Width="150" Height="30" /> </StackPanel> </Grid>
1.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中输入了什么。快乐编码…如果这解决了您的问题,请标记为答案。
mqkwyuun5#
试试这个:
private void Button_Click(object sender, RoutedEventArgs e) { string myTextboxValue = this.tbInput.Text; }
5条答案
按热度按时间9vw9lbht1#
首先,请记住WPF不是WinForms-理论上您应该将TextBox数据绑定到属性,然后更改属性的值,而不是直接访问TextBox!
也就是说,你所要做的就是命名UserControl和TextBox,然后访问它们,就像这样:
MyUserControl.xaml中:
MyWindow.xaml中:
在MyWindow.xaml.cs中:
aydmsdu92#
在usercontrol中,创建两个返回字符串的公共属性:
则来自文本框控件的文本对主窗体可见。
或者更好的选择:如果有一个用户控件可以引发的事件,请将其命名为
TextChanged
。当然,你想要一个更好的名字,所以让我们假设你的第一个文本框是为用户输入一个名字并调用事件NameTextChanged
而设计的,那么你的事件将是这样的:或者更好的是,你可以选择一个路由事件-但首先要坚持基本的。
6tdlim6h3#
订阅一个事件似乎是一个更好的选择,正如上面的slugster所建议的那样。如果使用此方法,则可以在同一窗口中具有同一用户控件的多个示例,但可以根据它们源自哪个用户控件来对它们进行不同的处理。
作为一个例子,你可以有地址类型的用户控件,可以有发件人地址和收件人地址,可能有相同的字段,如街道,城市,州等。但是当发送方地址或接收方地址被更新时可以有不同的行为。
希望这能帮上忙。
尼莱什·古莱
http://nileshgule.blogspot.com
uklbhaso4#
对于你的具体问题,我可以给你一个具体的解决方案。这不能被视为一个普遍的问题。
您的问题是在单击按钮时读取用户控件中文本框的内容。
解决方案如下
在这个解决方案中,将有两个xaml文件和它们各自的.cs文件。
逻辑:-内在逻辑是遍历用户控件中的可视化元素,找到文本框,单击按钮读取其中的文本。
这是密码
1.Window.xaml-这是我们的主窗口。它包含1个按钮和用户控件的对象引用。
1.TxtBoxedUC.xaml-这是我们的用户控件。这包含我们的两个文本框。
1.Window1.xaml.cs-包含按钮单击方法以及遍历用户控件中可视元素的方法。
上面的代码是用来处理按钮单击的。
上面的代码用于循环访问用户控件中的可视元素。
不需要用户控件的.cs文件。
现在,当你点击按钮时,你可以看到你在MessageBox中输入了什么。
快乐编码…
如果这解决了您的问题,请标记为答案。
mqkwyuun5#
试试这个: