Подтвердить что ты не робот

Может ли форма указать, открыты ли какие-либо модальные окна?

Как, находясь в основной форме моего приложения WinForm, могу ли я узнать, открыты ли какие-либо модальные окна/диалоги, принадлежащие основной форме?

4b9b3361

Ответ 1

if (this.Visible && !this.CanFocus)
{
    // modal child windows are open
}

Ответ 2

Короче говоря: открытие модальной формы - это выполнение блоков в основной форме, пока модальное окно открыто, поэтому ваша основная форма никогда не сможет проверить, открыли ли какие-либо модальные формы до закрытия модальной формы. Другими словами, ваш вопрос основан на неправильном понимании того, как работают модальные формы, поэтому его спор полностью.

Для чего стоит, можно ли открыть какие-либо модальные формы:

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

Ответ 3

Возможно, вы можете использовать события для EnterThreadModal и LeaveThreadModal. Вот пример, как вы можете это сделать:

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; }
    }
}

Ответ 4

Таймеры все еще запускают и запускают события. Пример, который работает...   открытый частичный класс Form1: Форма   {       Form2 f2 = new Form2();       public Form1()       {           InitializeComponent();       }

    private void timer1_Tick(object sender, EventArgs e)
    {
        f2.UpdateData(DateTime.Now.ToString());
        if (!f2.Visible) f2.ShowDialog();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        f2.ShowDialog();
        MessageBox.Show("Done");
    }
}

Ответ 5

Если вы Google немного, вы обнаружите, что Form.ShowDialog() отключает другие формы, чтобы предотвратить ввод пользователем этих форм текущего. Но большинство остальных (например, таймеры и другие события из источников, внешних по отношению к отображаемой форме) продолжают работать.