表格可以判断是否有任何模态窗口打开?

use*_*046 24 .net c# winforms

如何,在我的WinForm应用程序的主要形式内,我可以判断是否有任何模态窗口/对话框打开属于主窗体?

小智 31

if (this.Visible && !this.CanFocus)
{
    // modal child windows are open
}
Run Code Online (Sandbox Code Playgroud)


Jul*_*iet 6

简而言之:只要模态窗口打开,打开模态窗体就是在主窗体上执行块执行,因此在模态窗体关闭之前,您的主窗体永远无法检查它是否打开了任何模态窗体.换句话说,你的问题是基于对模态形式如何运作的误解,所以它完全没有实际意义.

对于什么它的价值,它可以说,如果有任何模式窗体打开:

foreach (Form f in Application.OpenForms)
{
    if (f.Modal)
    {
        // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 事实并非如此.如果确实如此,那么每当您在拥有的表单中移动"文件打开"对话框时,它将无法重新绘制.所以至少绘画会运行.一旦绘画运行,你可以做任何事情.有几个窗口消息可以通过并允许代码执行 (10认同)
  • 同意JaredPar,这是一个明智的问题.例如,如果您在调用以显示新对话框之前检查其他线程,该怎么办?尽管如此,代码示例仍然很好. (3认同)
  • JaredPar是对的,在模态形式关闭之前,消息泵肯定是不正确的.我有一个程序,它使用mainForm.BeginInvoke()从工作线程调度GUI线程上的方法.即使正在显示模态窗体,这也可以正常工作.令我惊讶的是,这意味着我的程序可以显示模态表单的多个副本.(这不是我的意图,现在我需要检测并避免这种情况.) (3认同)
  • 不幸的是,这段代码没有检测到模态消息框(例如,当使用MessageBox.Show时) (2认同)

jre*_*ert 5

您可以将事件用于EnterThreadModalLeaveThreadModal.以下是如何执行此操作的示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Application.EnterThreadModal += new EventHandler(Application_EnterThreadModal);
            Application.LeaveThreadModal += new EventHandler(Application_LeaveThreadModal);

            Application.Run(new Form1());
        }

        private static void Application_EnterThreadModal(object sender, EventArgs e)
        {
            IsModalDialogOpen = true;
        }

        private static void Application_LeaveThreadModal(object sender, EventArgs e)
        {
            IsModalDialogOpen = false;
        }

        public static bool IsModalDialogOpen { get; private set; }
    }
}
Run Code Online (Sandbox Code Playgroud)