gpt4 book ai didi

.net - Windows 窗体和 ShowDialog 问题

转载 作者:行者123 更新时间:2023-12-04 15:27:47 26 4
gpt4 key购买 nike

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

    关于.net - Windows 窗体和 ShowDialog 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2922940/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com