C# ShowDialog在WPF中的处理方式是否与Winforms不同?

C# ShowDialog在WPF中的处理方式是否与Winforms不同?,c#,wpf,winforms,visual-studio-2012,event-handling,C#,Wpf,Winforms,Visual Studio 2012,Event Handling,我在将Winforms程序转换为WPF程序时遇到了另一个问题。在我的第一个程序中,我打开了一个较小的窗口,允许用户调整一些数据,然后当它关闭时,另一个窗体被新数据再次激活 我使用了form2.ShowDialog()打开表单,这会自动使父表单在Winforms中停用。这样,当我关闭form2时,父窗体被激活,我可以使用事件处理程序form1\u activated成功地重新加载和初始化一些设置 然而,现在当我尝试用WPF做同样的事情时,我仍然能够使用form2.ShowDialog()打开for

我在将Winforms程序转换为WPF程序时遇到了另一个问题。在我的第一个程序中,我打开了一个较小的窗口,允许用户调整一些数据,然后当它关闭时,另一个窗体被新数据再次激活

我使用了
form2.ShowDialog()
打开表单,这会自动使父表单在Winforms中停用。这样,当我关闭form2时,父窗体被激活,我可以使用事件处理程序
form1\u activated
成功地重新加载和初始化一些设置

然而,现在当我尝试用WPF做同样的事情时,我仍然能够使用
form2.ShowDialog()打开form2
,但当我关闭表单时,它不会注册激活的
form1\u
事件处理程序。相反,为了重新加载设置,我必须单击另一个窗口,然后回到我的程序中注册
form1\u激活的
事件处理程序

是我做错了什么,还是我应该在WPF中使用另一个事件处理程序来实现我在Winforms中能够完成的相同任务?

调用ShowDialog()会导致对话框顶部以模态模式显示,因此我不明白为什么在对话框关闭后需要事件处理程序来处理结果。请记住,您也可以在对话框中访问公共变量。如果我理解你的问题,这应该符合你的要求:

主窗口:

My_DialogBox dlg = new My_DialogBox();
dlg.Owner = this;
dlg.MyPublicVariable = ''; //some value that you might need to pass to the dialog
dlg.ShowDialog();  //exection of MainWindow is suspended until dialog box is closed

if (dlg.DialogResult == true)
{
    //dlg.MyPublicVariable is still accessible 
    //call whatever routines you need in order to refresh the main form's data
}
对话框:

private void OK_Button_Click(object sender, RoutedEventArgs e)
{
    MyPublic variable = something;  //accessible after the dialog has closed.
    this.DialogResult = true;
}

private void Cancel_Button_Click(object sender, RoutedEventArgs e)
{
     this.DialogResult = false;
}
对话框上的MSDN说明非常好。可能有一些技巧对您的帮助更大:


祝你好运

窗口激活在WPF中非常脆弱。再说一次,您在Winforms中已经使用了错误的方法。在ShowDialog()调用后移动代码。还有,别忘了注意它的返回值。@HansPassant那么,当第二个窗口关闭时,我是否可以使用另一种方法来触发第一个窗口中的事件,就像我在Winforms中所做的那样?您可以在ShowDialog()调用后引发自己的事件。请注意这一点的荒谬性,在课堂上听自己的事件是没有意义的。直接调用事件处理程序。@HansPassant您的方法很荒谬,因为UI不是数据。在WPF中应用正确的模式消除了对荒谬的东西和代码的需求。请参考我的答案。