【问题标题】:Is ShowDialog handled differently in WPF than Winforms?WPF 中的 ShowDialog 处理方式是否与 Winforms 不同?
【发布时间】:2013-07-15 21:10:46
【问题描述】:

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

我使用form2.ShowDialog(); 打开表单,它会自动使父表单在 Winforms 中停用。这样,当我关闭 form2 时,父表单被激活,并且我能够使用事件处理程序 form1_Activated 成功重新加载和重新初始化一些设置。

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

我只是做错了什么,还是我应该在 WPF 中使用另一个事件处理程序来实现我在 Winforms 中能够执行的相同操作?

【问题讨论】:

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

标签: c# wpf winforms visual-studio-2012 event-handling


【解决方案1】:

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

主窗口:

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 关于对话框的文章非常好。可能有一些提示可能对您有更多帮助: http://msdn.microsoft.com/en-us/library/aa969773.aspx

祝你好运!

【讨论】:

    猜你喜欢
    • 2019-11-19
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多