【发布时间】:2014-03-03 16:40:25
【问题描述】:
我有一个名为 form1 的主窗口。在 form1 中我有一个按钮,按下它会打开 form2 (form2.ShowDialog())。在 form2 中,我有一个名为“检查”的按钮。当用户单击“检查”时,它应该进行一些验证,如果成功则创建一个字符串对象并将其返回给 form1。关于如何实现这一点的任何想法?当用户关闭窗口时,我不想返回任何东西。
【问题讨论】:
我有一个名为 form1 的主窗口。在 form1 中我有一个按钮,按下它会打开 form2 (form2.ShowDialog())。在 form2 中,我有一个名为“检查”的按钮。当用户单击“检查”时,它应该进行一些验证,如果成功则创建一个字符串对象并将其返回给 form1。关于如何实现这一点的任何想法?当用户关闭窗口时,我不想返回任何东西。
【问题讨论】:
在你的第二个窗口中创建一个事件,让事件委托的参数包含你想要传递的任何信息:
public class Popup : Window
{
public event Action<string> 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();
}
}
【讨论】:
popup.Check += value => label.Content = value, label2.Content = value;??
这个答案虽然不是完美的目标,但对于在这里谷歌搜索如何在窗口之间通信的一般解决方案的人来说会更有用:
根本没有理由设置事件来访问应用程序主窗口的对象。您可以简单地在弹出代码上调用它们并完成它:
((MainWindow)Application.Current.MainWindow).textBox1.Text = "Some text";
【讨论】:
这可以通过多种方式实现。 Servy 发布的方法非常好,可以完成您所需要的。我更希望看到Action<sting> 作为参数传递给构造函数并命名为callback,所以很清楚它的用途,但这只是一个偏好。
另一种非常擅长完成这项工作的方法是通过消息传递。 MVVMLight Toolkit 提供了一个很棒的小功能来完成这样的任务。
第 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 */ });
}
}
Setp 3:现在您正在发送消息,您需要能够接收该消息:
public class MessageReceiver
{
public MessageReceiver()
{
Messenger.Default.Register<MyMessage>(this, message => Foo(message));
}
public void Foo(MyMessage message)
{
//do stuff
}
}
【讨论】: