加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

.net – Windows窗体和ShowDialog问题

发布时间:2020-12-14 02:26:27 所属栏目:Windows 来源:网络整理
导读:我有一个无边框 Windows Forms应用程序. 主窗口使用ShowDialog()创建其他形式(我可以单击是或否的简单对话框). 在任务栏中看不到每个创建的对话框,我的应用程序只有一个任务栏条目可以聚焦我的应用程序(如果一个对话框是打开的,那么一个是关注的).如果我使用
我有一个无边框 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

一旦.它帮助我进行了半天的重构;)

解决方法

您是否尝试将对主窗口的引用传递给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:

This version of the ShowDialog method allows you to specify a specific form or control that will own the dialog box that is shown. If you use the version of this method that has no parameters,the dialog box being shown would be owned automatically by the currently active window of your application.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读