2010-06-17 4 views
16

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

ответ

5

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

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

+0

Это была моя первоначальная реализация - к сожалению, это приводит к сбою моей программы при запуске из фонового процесса по какой-то причине. Тем не менее, похоже, нет лучшего решения. Благодарю. – Smashery

+0

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

0

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

0

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

И иконки использовать

MessageBoxIcon.Warning

+0

'ShowDialog' сделает это Модальным. Полагаю, «Show» для Modeless. – Smashery

+0

извините, я был в замешательстве. – prashant

-1

Примечание: это создаст диалоговое окно Modal, которое не является вопросом, задающим вопрос

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

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

Я после немодального диалога; не модальный. – Smashery

+1

Этот ответ получал голоса, несмотря на то, что я был против того, что я просил (немощный). Чтобы другие не думали, что этот ответ разрешит эту конкретную проблему, я отредактировал ответ с отказом от ответственности. – Smashery

+0

+1 Спасибо, нашел это, когда вы ищете, как сделать модальный MessageBox. – Martin

1

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

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

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

0

не // нет CommNet

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(); 
    } 
} 

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

37

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

// 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. 
+1

Спасибо, это на самом деле ответили на вопрос напрямую. – eruciform

+0

Вы можете использовать 'MessageBox.Show' из потока, но не создавать и показывать целую« форму »? Есть ли какой-либо способ .NET для моделирования «MessageBox» с использованием формы? (возможно, мне нужен MessageBox с большим количеством вариантов, чем стандартное поле сообщения) –

+0

Это работает для меня, и, вопреки тому, что сказали тойотамы, это не модально, но немощно. – ajs410