form1
有一个button btnInvoke
,可以调用form2
。 form2
包含textbox
和button btn2
。
用户必须在textbox
中输入数据,然后按btn2
。
点击btn2
后,form2
必须将textbox data
发送给form1
。
我尝试过传递构造函数,但我无法启动form1
的新实例。
我该怎么办?
答案 0 :(得分:10)
您可以使用两种方法。第一个是使用ShowDialog和一个公共方法,然后测试DialogResult是否为真,然后从方法中读取值。
即
if (newWindow.ShowDialog() == true)
this.Title = newWindow.myText();
第二种方法是创建一个CustomEvent并在创建窗口中订阅它。
<强> MainWindow.xaml.cs 强>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Window1 newWindow = new Window1();
newWindow.RaiseCustomEvent += new EventHandler<CustomEventArgs>(newWindow_RaiseCustomEvent);
newWindow.Show();
}
void newWindow_RaiseCustomEvent(object sender, CustomEventArgs e)
{
this.Title = e.Message;
}
}
<强> Window1.xaml.cs 强>
public partial class Window1 : Window
{
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
public Window1()
{
InitializeComponent();
}
public string myText()
{
return textBox1.Text;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
RaiseCustomEvent(this, new CustomEventArgs(textBox1.Text));
}
}
public class CustomEventArgs : EventArgs
{
public CustomEventArgs(string s)
{
msg = s;
}
private string msg;
public string Message
{
get { return msg; }
}
}
答案 1 :(得分:1)
在form1
中定义公共财产。
public string MyTextData { get; set; }
在form2
按钮上单击,获取form1
的实例并将其属性设置为TextBox值。
var frm1 = Application.Current.Windows["form1"] as Form1;
if(frm1 ! = null)
frm1.MyTextData = yourTextBox.Text;
在Form1
{} {}}中,您会收到属性MyTextData
如果遵循命名窗口的约定,它会更好。使用Window
代替Form
来命名WPF中的窗口。表单通常与WinForm应用程序一起使用。
答案 2 :(得分:1)
这可能有点矫枉过正,但EventAggregator
可能是一个不错的解决方案。它允许您在form1
中举起一个可以从form2
订阅的活动。
在https://stackoverflow.com/questions/2343980/event-aggregator-implementation-sample-best-practices中有一些实施EventAggregator
的详细信息和示例。
答案 3 :(得分:0)
由于您使用的是WPF,请使用CommandBindings和Messaging。我还建议你看看MVVM框架,我优先考虑MVVM Light Toolkit。该框架有很多HowTos,只需要谷歌。