【问题标题】:Windows Forms and ShowDialog problemWindows 窗体和 ShowDialog 问题
【发布时间】: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


    【解决方案1】:

    您是否尝试过将对主窗口的引用传递给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 方法 允许您指定特定的表格 或将拥有该对话框的控件 显示的框。如果您使用 此方法的版本没有 参数,显示对话框 将被自动拥有 您当前活动的窗口 应用。

    【讨论】:

    • 我大概使用了该方法一千次,从未注意到有过载 ;) 无论如何,这是可行的。非常感谢。
    • +1,没有参数它会尝试找到一个。桌面窗口(如有必要)。
    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多