2010-06-17 12 views
16

W jaki sposób można uzyskać tworzenie Modeless MessageBox? Czy muszę po prostu utworzyć własną klasę Windows Form i użyć jej? Jeśli tak, czy istnieje prosty sposób dodania ikony ostrzeżenia (zamiast wstawiania własnego obrazu) i zmiany rozmiaru na podstawie objętości tekstu?Tworzenie bezmyślnej skrzynki wiadomości

Odpowiedz

5

Musisz utworzyć formularz i używać Show(), aby wyświetlić go niemodalne. MessageBox.Show(...) Zachował się Modal jak widać na przykładzie przez ghiboz; "Opis komunikatu" jest wyświetlany, dopóki użytkownik nie naciśnie przycisku.

Z MessageBox.Show(...) otrzymasz wynik natychmiast po zamknięciu skrzynki wiadomości; w przypadku okna niemodalnego, twój kod będzie musiał mieć mechanizm taki jak zdarzenie, które zareaguje, gdy użytkownik ostatecznie wybierze coś w twoim oknie komunikatu.

+0

To była moja pierwsza implementacja - niestety powoduje to awarię mojego programu podczas uruchamiania z procesu w tle z jakiegoś powodu. Niemniej wydaje się, że nie ma lepszego rozwiązania. Dzięki. – Smashery

+0

Nie można modyfikować elementów interfejsu użytkownika z dodatkowego wątku. Spójrz na Dispatchera, aby przenieść go do głównego wątku. – Jeff

0

Można użyć ikony standardowe ostrzegawczy system wykorzystujący SystemIcons

0

trzeba albo formy użytkowe i zadzwonić ShowDialog()

A dla ikony używać

MessageBoxIcon.Warning

+0

'ShowDialog' sprawi, że będzie modalny. "Show" jest dla Modeless, jak sądzę. – Smashery

+0

Przepraszam, byłem zdezorientowany. – prashant

-1

UWAGA: Ta utworzy okno dialogowe Modalne, które nie jest tym, o co pyta się:

tutaj jest przykładowy kod

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

Jestem po niemodalnym dialogu; nie modalny. – Smashery

+1

Ta odpowiedź otrzymała głosy, mimo że była przeciwieństwem tego, o co prosiłem (modeless). Aby inni nie sądzili, że ta odpowiedź rozwiąże ten konkretny problem, zredagowałem odpowiedź z zastrzeżeniem. – Smashery

+0

+1 Dzięki, znalazłem to, gdy szukałem sposobu na stworzenie modalnego MessageBox. – Martin

1

Krótki pisania kodu, można stworzyć małą formę, która w konstruktorze robi następujące

  • pobiera ciąg parametru jako komunikat do wyświetlania
  • zapełnia etykiety na formularzu z tym ciąg
  • Ładuje ikonę z jednego z następujących powodów (przesuń w enum do konstruktora)
    • SystemIcons.Application
    • SystemIcons.Asterix
    • SystemIcons.Error
    • SystemIcons.Exclamation
    • SystemIcons.Hand
    • SystemIcons.Information
    • SystemIcons.Question
    • SystemIcons.Shield
    • SystemIcons.Warning
    • SystemIcons.WinLogo
  • zwraca show(), która powoduje, że jest to modalne
  • dialogowe

Jeśli naprawdę chciał, można słuchać do zdarzenia, które są opalane, gdy przycisk jest wciśnięty przycisk OK.

0

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

potrzebuje więcej wątków i więcej kodu (nie mam wystarczająco dużo czasu, aby napisać) dla jednoczesnych okna komunikatów.

37

Jeśli potrzebujesz okna z komunikatem, które się wyświetla, gdy twój kod nadal działa w tle (pole nadal jest modalne i uniemożliwi użytkownikowi korzystanie z innych okien do momentu kliknięcia OK), zawsze możesz uruchomić okno komunikatu we własnym wątku i kontynuuj robienie tego, co robisz w oryginalnym wątku:

// 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

Dzięki, to faktycznie odpowiedział bezpośrednio na pytanie. – eruciform

+0

Możesz użyć 'MessageBox.Show' z wątku, ale nie skonstruować i pokazać cały" Form "? Czy istnieje sposób .NET do symulacji "MessageBox" za pomocą formularza? (być może potrzebuję MessageBox z większymi możliwościami wyboru niż standardowe okno komunikatu) –

+0

To działa dla mnie i, w przeciwieństwie do tego, co powiedziałem tojotamies, nie jest modalne, ale niemodalne. – ajs410

Powiązane problemy