Общий модальный диалог не отображается до нажатия клавиши Alt - PullRequest
4 голосов
/ 24 ноября 2010

Я создаю приложение, которое показывает модальное диалоговое окно для некоторой операции. Этот модальный диалог создается с использованием формы и имеет в качестве владельца главное окно приложения, которое передается в качестве параметра в методе Form.ShowDialog.

Этот модальный диалог должен вызывать обычный диалог при нажатии кнопки, (FontDialog) Общий диалог также отображается как модальное окно.

Таким образом, «иерархия владельцев» имеет вид (A -> B означает, что A «владеет» B) MainApp -> ModalDialog -> FontDialog

Хорошо, проблема в том, что FontDialog не отображается в любом случае, ЕСЛИ Я не нажму клавишу ALT. Приложение ведет себя почти так, как ожидалось, т.е. когда я вызываю FontDialog.ShowDialog (), я не могу установить фокус ни на окно MainApp, ни на ModalDialog, но FontDialog просто «невидим», пока я не нажму клавишу ALT (только этот единственный ключ), а затем появляется.

Кто-нибудь знает, почему это происходит? Я попытался установить для владельца FormDialog значение null (таким образом, используя рабочий стол как окно владельца), но он ведет себя так же неправильно.

Заранее спасибо.

некоторый код Открытый класс SnapshotDialogView: Форма { /// бла бла бла

        ///
        /// Button click handler
        private void btnChangeFont_Click(object sender, EventArgs e)
        {
            // this.Owner == MainAppWindow
            DialogResult result = fontDialog.ShowDialog(this);

            if (DialogResult.Cancel == result)
                return;

            Presenter.ChangeLabelsFont(fontDialog.Font);
        }
}

Ах, да, еще одна вещь. Если я скрою ModalDialogForm (SnapshotDialogView в коде) перед вызовом FontDialog.ShowDialog (), диалоговое окно шрифта будет отображаться нормально.

Ответы [ 5 ]

4 голосов
/ 22 февраля 2011

У меня была похожая проблема с использованием MessageBox.Show().
После некоторого чтения / тестирования я обнаружил, что это побочный эффект переопределения onPaint() с одним из моих компонентов. Я предполагаю, что он пропускает обновление или что-то, когда основной кадр теряет фокус, так как все, что может привести к его перерисовке, вызывает появление MessageBox.

мое быстрое решение - установить компонент Visible = false до отображения диалогового окна и установить его в значение true после:

    private void btn_Click(object sender, EventArgs e)
    {
        Grid.Visible = false;
        MessageBox.Show("asdf");
        Grid.Visible = true;
    }

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

Редактировать: Я только что прочитал ваши комментарии, и похоже, что мы нашли похожие решения.

1 голос
/ 25 февраля 2012

Я не привык кодировать в .NET, но я столкнулся с аналогичной проблемой с моим кодом win32 (чистый c ++) и функцией MessageBox ().Что я ошибаюсь, так это то, что я не рисовал с помощью пары функций BeginPaint () и EndPaint () в обработчике WM_PAINT.Как только я добавил эти две функции и сделал код для рисования между ними, проблема исчезла.Хотя я не знаю, как это можно сделать в среде .NET: (

1 голос
/ 12 января 2011

Вот простой пример сценария, который вы описали.

using System;
using System.Drawing;
using System.Windows.Forms;

public class MainAppForm : Form
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainAppForm());
    }
    public MainAppForm()
    {
        Text = "MainAppForm";
        Controls.Add(new Button { Text = "Show ModalDialog", AutoSize = true, Location = new Point(10, 10) });
        Controls[0].Click += (s, e) =>
            {
                using (ModalDialog dlg = new ModalDialog())
                    dlg.ShowDialog(this);
            };
    }
}

public class ModalDialog : Form
{
    public ModalDialog()
    {
        Text = "ModalDialog";
        Controls.Add(new Button { Text = "Show FontDialog", AutoSize = true, Location = new Point(10, 10) });
        Controls[0].Click += (s, e) =>
        {
            using (FontDialog dlg = new FontDialog())
                dlg.ShowDialog(this);
        };
    }
}

Он не демонстрирует поведение, которое вы описываете.Это означает, что в вашем коде есть что-то, что является ошибкой.

Я предлагаю начать удалять весь код, который вы можете, пока проблема не исчезнет.Это должно подсказать вам, в чем заключается проблема.

В качестве альтернативы вы можете начать с вышеуказанной программы и начать добавлять свой код, пока проблема не появится.

0 голосов
/ 22 августа 2014

У меня была такая же проблема с MessageBox в VBNet.

Кажется, что окна, хотя самое верхнее окно не является действительным.Вызывая BringToFront () прямо перед MessageBox.show, он решает проблему:

Me.BringToFront()
MessageBox.Show("blablabla", Me.Text, 
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question)
0 голосов
/ 24 ноября 2010

Попробуйте использовать вашу модальную форму в качестве владельца вашего FontDialog:

yourFontDialog.ShowDialog(yourModalForm);
...