6

我有一个无边界的Windows 窗体应用程序。

主窗口使用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

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

4

1 回答 1

6

您是否尝试过将对主窗口的引用传递给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);

引用此重载的文档

此版本的 ShowDialog 方法允许您指定将拥有显示的对话框的特定窗体或控件。如果您使用没有参数的此方法版本,则显示的对话框将自动归应用程序的当前活动窗口所有。

于 2010-05-27T16:33:53.677 回答