Создать немодальное окно сообщений - PullRequest
21 голосов
/ 17 июня 2010

Как можно создать немодальный MessageBox? Должен ли я просто создать свой собственный класс Windows Form и использовать его? Если да, есть ли простой способ добавить значок предупреждения (вместо того, чтобы вставить свое собственное изображение одного) и изменить размер в зависимости от объема текста?

Ответы [ 7 ]

47 голосов
/ 17 мая 2011

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

    // Do stuff before.
    // Start the message box -thread:
    new Thread(new ThreadStart(delegate
    {
      MessageBox.Show
      (
        "Hey user, stuff runs in the background!", 
        "Message",
        MessageBoxButtons.OK,
        MessageBoxIcon.Warning
      );
    })).Start();
    // Continue doing stuff while the message box is visible to the user.
    // The message box thread will end itself when the user clicks OK.
6 голосов
/ 18 июня 2010

Вам нужно будет создать форму и использовать Show() для ее отображения без режима.MessageBox.Show(...) вел себя модально, как видно на примере ghiboz;«Описание сообщения» отображается до тех пор, пока пользователь не нажмет кнопку.

С помощью MessageBox.Show(...) вы получите результат, как только окно сообщения закроется;с немодальным окном сообщений у вашего кода должен быть механизм, например, событие, реагирующее, когда пользователь в конечном итоге что-то выбирает в вашем окне сообщения.

1 голос
/ 18 июня 2010

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

  • Принимает строку параметров в качестве сообщения для отображения
  • Заполняет метку в форме этой строкой
  • Загружает значок с одним из следующих (передать Enum конструктору)
    • SystemIcons.Application
    • SystemIcons.Asterix
    • SystemIcons.Error
    • SystemIcons.Exclamation
    • SystemIcons.Hand
    • SystemIcons.Information
    • SystemIcons.Question
    • SystemIcons.Shield
    • SystemIcons.Warning
    • SystemIcons.WinLogo
  • Вызывает Show (), что приведет к тому, что это будет модальный диалог

Если вы действительно хотите, вы можете прослушать событие, которое запускается при нажатии кнопки ОК.

0 голосов
/ 19 июня 2010

// без связи

object sync = new object();
ManualResetEvent Wait = new ManualResetEvent();
//you should create a place holder named MessageData for Message Data.
List<MessageData> Messages = new List<MessageData>();
internal void ShowMessage(string Test, string Title, ....)
{
    MessageData MSG = new MessageData(Test, Title);
    Wait.Set();
    lock(sync) Messages.Add(MSG);
}
// another thread should run here.
void Private_Show()
{
    while(true)
{
        while(Messsages.Count != 0)
        {
            MessageData md;
            lock(sync)
            {
                md = List[0];
                List.RemoveAt(0);
            }
            MessageBox.Show(md.Text, md.Title, md....);
        }
        Wait.WaitOne();
    }
}

требуется больше потоков и больше кода (у меня нет достаточно времени для написания) для одновременных ящиков сообщений.

0 голосов
/ 17 июня 2010

Примечание: это создаст модальное диалоговое окно, которое не соответствует тому, что задает вопрос

вот пример кода

if (MessageBox.Show("Description of the message", "Caption text", MessageBoxButtons.YesNo, MessageBoxIcon.Error) == DialogResult.Yes)
{
    // Do some stuff if yes pressed
}
else
{
    // no pressed
}
0 голосов
/ 17 июня 2010

Вы должны либо использовать форму и вызвать showDialog ()

А для значков использовать

MessageBoxIcon.Warning

0 голосов
/ 17 июня 2010

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

...