在WPF表单之间传递数据

form1有一个button btnInvoke调用form2form2包含一个textbox和一个button btn2

用户必须在textbox输入数据并按btn2

单击btn2form2必须将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。