【发布时间】:2011-02-24 18:16:42
【问题描述】:
我有一个无边界的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
一次。它帮助我进行了半天的重构;)
【问题讨论】:
标签: .net winforms showdialog