我有一个无边框Windows Forms应用程序。Windows窗体和ShowDialog问题
主窗口创建其他形式(简单对话框,我可以点击是或否)与ShowDialog()
。 每个创建的对话框在任务栏中都不可见,我的应用程序只有一个专注于我的应用程序的任务栏条目(并且如果打开了一个对话框)。如果我使用ALT + TAB要循环到所有打开的窗口,我也只能看到一个条目。但是,如果在我的应用程序没有焦点的情况下创建对话框(例如,用户启动一个长时间运行的任务,开始处理其他内容并处于后台时,我的应用程序将显示一个对话框“任务完成...“),我想回到我的应用程序,事情变得奇怪。
- 如果我点击任务栏来关注我的应用程序,主窗口将会被聚焦(而不是对话框)。
- 我无法使用主窗口(因为仍然有一个开放的模式对话框)。
- Windows 7的ALT + TAB 预览显示对话框,而任务栏鼠标悬停预览显示主窗口(在正常的行为都显示在主窗口的前面的对话)。
- 让我的应用程序再次可用的唯一方法是ALT + TAB进入并关闭模式对话框。
- 如果我使用ALT + TAB只有对话框位于前面,主窗口仍在后台。
有没有办法阻止这种情况发生? 我知道该怎么做,但大多数客户认为应用程序崩溃,因为主窗口没有响应。
更新:
的解决方案是通过顶层窗口到ShowDialog()
方法(在大多数情况下,如果在一形式使用,这将是在“本”)。
由于我不想重构我的整个代码,并且我的所有表单都从“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
一次。它帮助我重构了半天;)
我可以有效地使用该方法一千次,从来没有注意到有超载;)无论如何,这是有效的。多谢。 – 2010-05-27 17:01:14
+1,没有它会试图找到一个参数。桌面窗口,如有必要。 – 2010-05-27 17:17:49