C# – 在WPF中将子窗口中的变量返回到父窗口

我有一个名为form1的主窗口。 在form1我有一个按钮,当它被按下它将打开form2(form2.ShowDialog())。 在form2中,我有一个名为“Check”的按钮。 当用户点击“Check”时,它应该进行一些validation,如果成功,则创建一个字符串对象并将其返回到form1。 有关如何实现这一点的任何想法? 当用户关闭窗口时,我不想返回任何内容。

在第二个窗口中创建一个事件,让事件委托的参数包含您要传递的任何信息:

public class Popup : Window { public event Action Check; public void Foo() { //fire the event if (Check != null) Check("hello world"); } } 

然后主窗口可以订阅该事件以使用该信息执行所需操作:

 public class Main : Window { private Label label; public void Foo() { Popup popup = new Popup(); popup.Check += value => label.Content = value; popup.ShowDialog(); } } 

这个答案虽然不是完美的目标对于那些谷歌自己在这里通过如何在Windows之间进行通信的一般解决方案的人会更有用:

完全没有理由设置事件来访问应用程序主窗口的对象。 你可以简单地在弹出代码上调用它们并完成它:

 ((MainWindow)Application.Current.MainWindow).textBox1.Text = "Some text"; 

这可以通过几种方式实现。 Servy发布的方法非常好,可以满足您的需求。 我更希望看到Action作为参数传递给构造函数并命名为callback因此很清楚它的用途是什么,但这只是一个偏好的东西。

完成此任务的另一种方法是通过Messaging。 MVVMLight Toolkit为完成此类任务提供了一个很棒的function。

第1步:创建强类型消息:

 public class MyMessage : MessageBase { //Message payload implementation goes here by declaring properties, etc... } 

第2步:确定发布该消息的位置和时间。

 public class PublishMessage { public PublishMessage(){ } public void MyMethod() { //do something in this method, then send message: Messenger.Default.Send(new MyMessage() { /*initialize payload here */ }); } } 

第3步:现在您正在发送消息,您需要能够接收该消息:

 public class MessageReceiver { public MessageReceiver() { Messenger.Default.Register(this, message => Foo(message)); } public void Foo(MyMessage message) { //do stuff } }