当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《表格可以判断是否有任何模态窗口打开?》经验,为你挑选了3个好方法。

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



1> 小智..:
if (this.Visible && !this.CanFocus)
{
    // modal child windows are open
}



2> Juliet..:

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

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

foreach (Form f in Application.OpenForms)
{
    if (f.Modal)
    {
        // do stuff
    }
}


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

3> jreichert..:

您可以将事件用于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; }
    }
}

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有