Может ли форма сказать, есть ли открытые модальные окна? - PullRequest
24 голосов
/ 04 января 2009

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

Ответы [ 5 ]

31 голосов
/ 19 января 2009
if (this.Visible && !this.CanFocus)
{
    // modal child windows are open
}
6 голосов
/ 04 января 2009

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

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

foreach (Form f in Application.OpenForms)
{
    if (f.Modal)
    {
        // do stuff
    }
}
5 голосов
/ 26 марта 2015

Вы можете использовать события для 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; }
    }
}
0 голосов
/ 22 декабря 2017

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

0 голосов
/ 22 декабря 2017

Таймеры все еще работают и запускают события.
Пример, который работает ...

public partial class Form1 : Form
{
    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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...