MessageBox не отображается в форме mdi после длительного расчета - PullRequest
0 голосов
/ 30 марта 2010

Эта проблема очень похожа на Эта , к сожалению, на нее тоже никто не ответил.

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

Поведение немного меняется, если я вызываю Application.DoEvents () (я знаю, зло, но это последнее средство). Тогда формы остаются полностью активными, и окно сообщения появляется только после того, как я изменяю активное приложение (Alt + Tab) на что-то другое, а затем снова обратно.

Что я могу сделать, чтобы окно сообщений было видно? Я уже пытался передать оба, активный дочерний элемент и MDI Main в качестве параметра методу MessageBox.Show. Это не меняет поведение.

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

Ответы [ 3 ]

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

У меня была такая же проблема. При нажатии ALT всплывающее окно показывало.

Оказалось, что это LinkedLabel, у которого свойство AutoSize имеет значение true. LinkedLabel был внутри FlowLayoutPanel. Когда я устанавливаю свойство LinkedLabel.Text в String.Empty. LinkedLabel постоянно пытался изменить размер, из-за чего графический интерфейс был постоянно занят.

Когда я выключил свойство AutoSize и графический интерфейс больше не должен был пересчитывать позиции. Графический интерфейс не был бесплатным. И всплывающее окно показало.

Могут быть другие элементы управления, которые ведут себя так же. Смотрите также: https://connect.microsoft.com/VisualStudio/feedback/details/116884

0 голосов
/ 30 марта 2010

Проблема в том, что почтовые ящики имеют тенденцию быть модальными. В этом случае я думаю, что вы бы лучше использовали делегат или событие с обработчиком в вашем основном коде MDI. Таким образом, ваше основное приложение отображает окна сообщений. Вы можете легко переопределить EventArgsType, если хотите передать любую необходимую вам информацию.

0 голосов
/ 30 марта 2010

Отображается ли MessageBox в основной форме или как часть дочерних форм? Если MessageBox находится в дочерних формах, возможно, вы могли бы передать событие обратно в MainForm и открыть там MessageBox.

...