Windows窗体和ShowDialog问题

时间:2010-05-27 16:29:49

标签: .net winforms showdialog

我有一个无边框Windows Forms应用程序。

主窗口使用ShowDialog()创建其他表单(我可以单击是或否的简单对话框)。 在任务栏中看不到每个创建的对话框,我的应用程序只有一个任务栏条目可以聚焦我的应用程序(如果一个对话框是打开的,那么一个是关注的)。如果我使用 ALT + TAB 循环到所有打开的窗口我也只看到一个条目。

但是,如果在我的应用程序没有焦点的情况下创建对话框(例如,用户启动一个长时间运行的任务,开始处理其他事情,而在后台,我的应用程序显示一个对话框“任务完成......“)我想回到我的应用程序,事情变得很奇怪。

  • 如果我点击任务栏以关注我的应用程序,主窗口将被聚焦(而不是对话框)。
  • 我无法使用主窗口(因为还有一个打开的模态对话框)。
  • Windows 7 ALT + TAB 预览显示对话框,而任务栏鼠标悬停预览显示主窗口(正常行为都显示主窗口前面的对话框)
  • 让我的应用程序再次可用的唯一方法是将 ALT + TAB 添加到条目并关闭模式对话框。
  • 如果我使用 ALT + TAB ,则只有对话框显示在前面,主窗口仍然在后台。

有没有办法防止这种情况发生? 我知道该怎么做,但大多数客户都认为应用程序崩溃了,因为主窗口没有响应。

更新

解决方案是将顶级窗口传递给ShowDialog()方法(在大多数情况下,如果以“this”的形式使用)。

由于我不想重构我的整个代码,而且我的所有表单都继承自“MyCustomFormBase”,这里有一个很好的解决方案。

Public Class MyCustomFormBase

    Public Shared Property ApplicationMainForm() As Form
        Get
            Return _applicationMainform
        End Get
        Set(ByVal value As Form)
            _applicationMainform = value
        End Set
    End Property
    Private Shared _applicationMainform As Form

    Public Shadows Function ShowDialog() As DialogResult
        If MyCustomFormBase.ApplicationMainForm IsNot Nothing Then
            Return MyBase.ShowDialog(MyCustomFormBase.ApplicationMainForm)
        Else
            Return MyBase.ShowDialog()
        End If
    End Function

    Public Shadows Function ShowDialog(ByVal owner As IWin32Window) As DialogResult
        Return MyBase.ShowDialog(owner)
    End Function

End Class

在主窗口的构造函数中,我使用

MyCustomFormBase.ApplicationMainForm = Me

一次。它帮助我进行了半天的重构;)

1 个答案:

答案 0 :(得分:4)

您是否尝试将对主窗口的引用传递给ShowDialog来电?

// assuming this code is in the main form (so "this" refers to the main form)
DialogForm dialog = new DialogForm();
DialogResult result = dialog.ShowDialog(this);

来自documentation of this overload

的引用
  

此版本的ShowDialog方法   允许您指定特定表单   或拥有对话框的控件   显示的框。如果你使用   这个方法的版本没有   参数,显示对话框   将由...自动拥有   你当前活跃的窗口   应用