В приложении формы есть ли альтернатива MsgBox? - PullRequest
1 голос
/ 08 января 2011

Мне нравится, как MsgBox останавливает всю дальнейшую обработку, пока на него не нажимают, но мне не нравится, как он выводит этот маленький msgbox в середину экрана.

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

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

Ответы [ 2 ]

3 голосов
/ 08 января 2011

, который я затем перенесу на фронт, если есть окно, закрывающее его

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

Существует опция MessageBoxOptions, которая не отображается в Winforms, MB_TOPMOST, которая гарантирует, что окно является самым верхним. Вы бы использовали это так:

            MessageBox.Show("text", "caption", MessageBoxButtons.OK,
                MessageBoxIcon.Information, MessageBoxDefaultButton.Button1,
                (MessageBoxOptions)0x40000);    // use MB_TOPMOST

Но, безусловно, лучшее, что нужно сделать, это отобразить окно сообщения в вашей ветке пользовательского интерфейса. Используйте Control.Invoke () для этого. Таким образом, другие окна вашего приложения отключаются, и пользователь не может не заметить этот флажок.

Еще одна проблема с этим, пользователь не будет ожидать появления окна, так как оно отображается асинхронно из всего, что он делает. Это означает, что окно может быть легко удалено случайно, когда пользователь случайно нажал клавишу Enter или пробел. Или щелкнул не в том месте. С этим ничего не поделаешь.

Центрирование поля в вашем главном окне технически возможно, но сделать это сложно. Проверьте этот ответ .

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

Вы имеете в виду, что форма должна обмениваться своим содержимым с сообщением плюс кнопка ОК?

Это похоже на то, как обычно работает интерфейс текстового режима.

Вы можете сделать это, добавив отключенную панель или UserControl с сообщением и самой верхней кнопкой на форме и включив ее, когда вы хотите предупредить пользователя. Однако я озадачен тем, как реализовать поведение блокировки, подобное MessageBox.Show () и Dialog.Show ().

...