我有一个名为form1的主窗口。在form1我有一个按钮,按下它将打开form2(form2.ShowDialog())。在form2中,我有一个名为“Check”的按钮。当用户点击“Check”时,它应该进行一些验证,如果成功,则创建一个字符串对象并将其返回到form1。有关如何实现这一点的任何想法?当用户关闭窗口时,我不想返回任何内容。
答案 0 :(得分:10)
在第二个窗口中创建一个事件,让事件委托的参数包含您想要传递的任何信息:
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();
}
}
答案 1 :(得分:2)
这个答案虽然目标不完美,但对于那些谷歌自己在这里寻求如何在窗口之间进行通信的一般解决方案的人来说会更有用:
根本没有理由设置事件来访问应用程序主窗口的对象。你可以简单地在弹出代码上调用它们并完成它:
((MainWindow)Application.Current.MainWindow).textBox1.Text = "Some text";
答案 2 :(得分:0)
这可以通过几种方式实现。 Servy发布的方法非常好,可以满足您的需求。我希望看到Action<sting>
作为参数传递给构造函数并命名为callback
,因此很清楚它的用途,但这只是一个偏好。
完成此任务的另一种方法是通过Messaging。 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
}
}