2010-05-27 163 views
6

我有一个无边框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 

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

回答

4

您是否尝试过将主窗口的引用传递给ShowDialog调用?从documentation of this overload

// 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方法 允许你指定一个特定的形式 或控制将拥有所显示的对话框 框。如果使用此方法的 版本没有 参数,则显示的对话框 将由 应用程序的当前活动窗口自动拥有。

+0

我可以有效地使用该方法一千次,从来没有注意到有超载;)无论如何,这是有效的。多谢。 – 2010-05-27 17:01:14

+0

+1,没有它会试图找到一个参数。桌面窗口,如有必要。 – 2010-05-27 17:17:49