Как можно создать текстовое MessageBox? Должен ли я просто создать свой собственный класс Windows Form и использовать его? Если да, есть ли простой способ добавить значок предупреждения (вместо того, чтобы вставлять мой собственный образ одного) и изменять размер на основе тома текста?Создать текстовый файл Modeless
ответ
Вы должны создать форму и использовать Show()
, чтобы отобразить его Немодальные. MessageBox.Show(...)
Вел себя Модально, как видно на примере ghiboz; «Описание сообщения» отображается до тех пор, пока пользователь не нажмет кнопку.
С MessageBox.Show(...)
вы получаете результат, как только почтовый ящик закрыт; с модульным ящиком сообщений, ваш код должен будет иметь такой механизм, как событие, чтобы реагировать, когда пользователь в конечном итоге выбирает что-то в вашем окне сообщения.
Вы можете использовать стандартный значок предупреждения системы с использованием SystemIcons
Примечание: это создаст диалоговое окно 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
}
Я после немодального диалога; не модальный. – Smashery
Этот ответ получал голоса, несмотря на то, что я был против того, что я просил (немощный). Чтобы другие не думали, что этот ответ разрешит эту конкретную проблему, я отредактировал ответ с отказом от ответственности. – Smashery
+1 Спасибо, нашел это, когда вы ищете, как сделать модальный MessageBox. – Martin
Короткие написания кода, вы могли бы создать небольшую форму, которая в конструкторе выполняет следующие
- принимает строку параметров, как сообщение, чтобы
- Заполняет метку на форме с этим строка
- Загружает значок с одним из следующих способов (передать в Enum конструктору)
SystemIcons.Application
SystemIcons.Asterix
SystemIcons.Error
SystemIcons.Exclamation
SystemIcons.Hand
SystemIcons.Information
SystemIcons.Question
SystemIcons.Shield
SystemIcons.Warning
SystemIcons.WinLogo
- вызовы Показать(), который заставит его быть модальным
Если вы действительно хотите, вы можете слушать событие, которое вызывается при нажатии на кнопку OK нажата.
не // нет 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.
Если вам нужно окно с сообщением, которое отображается только во время работы вашего кода в фоновом режиме (поле по-прежнему является модальным и не позволит пользователю использовать другие окна, пока не будет нажата кнопка ОК), вы всегда можете запустить окно сообщения в своей собственной нити и продолжать делать то, что вы делаете в исходной резьбе:
// 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.
Спасибо, это на самом деле ответили на вопрос напрямую. – eruciform
Вы можете использовать 'MessageBox.Show' из потока, но не создавать и показывать целую« форму »? Есть ли какой-либо способ .NET для моделирования «MessageBox» с использованием формы? (возможно, мне нужен MessageBox с большим количеством вариантов, чем стандартное поле сообщения) –
Это работает для меня, и, вопреки тому, что сказали тойотамы, это не модально, но немощно. – ajs410
Это была моя первоначальная реализация - к сожалению, это приводит к сбою моей программы при запуске из фонового процесса по какой-то причине. Тем не менее, похоже, нет лучшего решения. Благодарю. – Smashery
Пользовательский интерфейс не может быть обработан из вторичной нити. Взгляните на диспетчера, чтобы перенести его в основной поток. – Jeff