在WPF表单之间传递数据
form1
有一个button btnInvoke
调用form2
。 form2
包含一个textbox
和一个button btn2
。
用户必须在textbox
输入数据并按btn2
。
单击btn2
, form2
必须将textbox data
发送到form1
。
我试过传递构造函数,但我无法启动form1
的新实例。
我该怎么办?
您可以使用两种方法。 第一个是使用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(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 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; } } }
在您的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应用程序一起使用。
它可能EventAggregator
矫枉过正,但EventAggregator
可能是一个不错的解决方案。 它允许您在form1
中引发一个事件,然后可以从form2
订阅。
在https://stackoverflow.com/questions/2343980/event-aggregator-implementation-sample-best-practices中有一些实现EventAggregator
细节和示例。
由于您使用的是WPF,因此请使用CommandBindings和Messaging 。 我还建议你看一下MVVM框架,我更喜欢MVVM Light Toolkit 。 这个框架有很多HowTos,只要问google。