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 } }