Как убедиться, что форма Windows полностью закрыта? - PullRequest
0 голосов
/ 06 июля 2010

У меня есть форма в приложении формы Windows, которую я хочу отобразить поверх главной формы, закройте ее, а затем сразу же откройте диалоговое окно, используя MessageBox.Show().Но первая форма все еще отображается, когда отображается окно сообщения, и оно не исчезает, пока я не нажму OK в окне сообщения.Я пытался дождаться отображения окна сообщения в обработчике события для формы VisibleChanged и даже вызвать Refresh() как в форме, так и в основной форме.Есть ли способ определить, когда первая форма полностью исчезла, перед отображением окна сообщения?

Редактировать:

Вот код, который демонстрирует, как отображаются формы.

static class Program
{
    // The main form is shown like this:
    static void Main()
    {
        Application.Run(new MainForm());
    }
}

public class Class1 
{
    // _modalForm is the first form that is displayed that won't fully go away 
    // when it is closed.
    ModalForm _modalForm;
    BackgroundWorker _worker;

    public Class1()
    {
        _modalForm = new ModalForm();
        _worker = new BackGroundWorker();
        _worker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted
    }

    public void Method1()
    {
        _worker.RunWorkerAsync();

        // The first form is shown.
        _modalForm.ShowDialog();
    }


    // This code runs in the UI thread.         
    void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        _modalForm.VisibleChanged += new EventHandler(_modalForm_visibleChanged);
        _modalForm.Close();
    }

    void _modalForm_visibleChanged(object sender, EventArgs e)
    {
        // When the message box is shown, the other form is still visible
        // and remains so until I click OK.
        MessageBox.Show("The other form was just closed.");

        // Note:  I originally tried to use the FormClosed event instead of
        // VisibleChanged.  Then I tried Deactivate, in attempt to use an event
        // that occurred later thinking that might do the trick.  VisibleChanged
        // is the latest event that I found.
        // 
    }

Ответы [ 3 ]

5 голосов
/ 06 июля 2010

Я предполагаю, что вы запускаете свой код в Windows XP или Vista / Win7 с выключенным Aero.При закрытии формы не пиксели на экране мгновенно исчезают.Диспетчер окон Windows видит, что окно для формы было разрушено и что под ним обнаруживаются части других окон.Он доставит сообщение WM_PAINT, чтобы сообщить им, что им нужно перекрасить те части окна, которые были открыты.

Это не будет работать должным образом, если одно или несколько из этих окон не накачивают петлю сообщения.,Они не могут видеть сообщение WM_PAINT.Они не будут перекрашиваться, пиксели закрытой формы останутся на экране.

Узнайте, почему эти окна не отвечают.Надеюсь, это ваше окно, и отладчик может показать вам, что делает поток пользовательского интерфейса.Убедитесь, что он не блокируется и не зацикливается.


После просмотра редактирования: действительно происходит блокирование, другого типа.Вызов MessageBox.Show () является модальным, он предотвращает завершение события VisibleChanged.Это задерживает закрытие формы.

Используйте System.Diagnostics.Debug.WriteLine () или Console.WriteLine (), чтобы получить диагностику в приложении Window Forms.Вы увидите это в окне вывода.Или просто используйте точку останова отладчика.

2 голосов
/ 06 июля 2010

Событие Form.FormClosed возникает, когда форма закрывается.На этом этапе все Form.FormClosing обработчики событий были запущены, и ни один из них не отменил закрытие.

Form.FormClosed заменил Form.Closed (что устарело) в .NET 2.0 framework.

1 голос
/ 06 июля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...