В приложении форм есть ли альтернатива MsgBox?

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

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

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


person GuruC    schedule 08.01.2011    source источник
comment
Я не совсем понимаю, о чем ты спрашиваешь. Если вы установите свою форму в качестве владельца окна сообщений, оно будет отображаться поверх вашей формы. Нет никаких причин, чтобы это когда-либо было спрятано за чем-то еще, иначе вам пришлось бы вынести это на передний план. Я также не понимаю, хотите ли вы иметь возможность взаимодействовать с формой во время отображения окна сообщения. Когда вы говорите, нажмите кнопку в форме, что вы имеете в виду?   -  person Cody Gray    schedule 08.01.2011
comment
@Cody - я немного отредактировал вопрос для первой части твоего комментария !!   -  person GuruC    schedule 08.01.2011


Ответы (2)


который я затем выношу на передний план, если его закрывает окно

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

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

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

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

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

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

person Hans Passant    schedule 08.01.2011
comment
Отличный ответ! Мне понравилась первая строка ответа! Я постараюсь взять то, что вы упомянули, и реализовать это, и дам вам знать, если у меня возникнут какие-либо проблемы! - person GuruC; 08.01.2011

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

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

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

person Christian Madsen    schedule 08.01.2011