我有一个无边框Windows Forms应用程序。
主窗口使用ShowDialog()
创建其他表单(我可以单击是或否的简单对话框)。
在任务栏中看不到每个创建的对话框,我的应用程序只有一个任务栏条目可以聚焦我的应用程序(如果一个对话框是打开的,那么一个是关注的)。如果我使用 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
一次。它帮助我进行了半天的重构;)
答案 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方法 允许您指定特定表单 或拥有对话框的控件 显示的框。如果你使用 这个方法的版本没有 参数,显示对话框 将由...自动拥有 你当前活跃的窗口 应用