20 Stimmen

System.Windows.MessageBox wartet nicht auf die Benutzereingabe, bevor es verschwindet!

...und es ergibt keinen Sinn warum. T-T

In meinem Application_Startup Ereignishandler habe ich Code, der ungefähr so aussieht:

private void Application_Startup(object sender, StartupEventArgs e)
{
    string errorMessage;

    if(CheckStartUpConditions(out errorMessage))
    {
        (new MainWindow()).Show();
    }
    else
    {
        MessageBox.Show(errorMessage, "Application Startup", 
            MessageBoxButton.OK, MessageBoxImage.Error);

        Shutdown();
    }
}

private bool CheckStartUpConditions(out string errorMessage)
{
    errorMessage = string.Empty;  

    if(...)
        errorMessage += "Bitte bei xxx anmelden. ";

    if(...)
        errorMessage += "Bitte xxx installieren.";

    if(string.IsNullOrEmpty(errorMessage))
        return true;
    else
        return false;
}

Die Meldung erscheint für etwa eine Sekunde, bevor sie "POOF!" verschwindet. Sie wartet nicht darauf, dass ich auf "OK" oder die "X"-Schaltfläche klicke. Ich bin wirklich ratlos, warum dies passiert, also wäre jede Hilfe sehr geschätzt.

Ich habe versucht, den Aufruf von Shutdown nur zum Spaß auszukommentieren, und es verhält sich immer noch genauso.

Außerdem hat die Anwendung auch einen SplashScreen, also weiß ich nicht, ob das dies beeinflusst.

EDIT: Ich habe mehr Code hinzugefügt, falls das hilft. Die Meldungsbox zeigt die richtige Fehlermeldung an. Aber sie bleibt nicht lange genug für die Benutzer sichtbar, um sie zu lesen. >:(

EDIT TEIL 2: Okay...ich glaube, ich habe den Übeltäter gefunden. :( Ich habe die Build-Aktion des Bildes, das ich als Splash verwende, von SplashScreen auf None geändert und die Meldungsbox bleibt nun stehen und wartet auf Benutzereingabe. Ich verstehe nicht, warum der SplashScreen die Nachrichtenbox durcheinander bringt. >:(

0 Stimmen

Ich kann dieses Problem nicht reproduzieren. Ich habe eine MessageBox in diesem Ereignis in einer Testanwendung platziert und sie bleibt auf dem Bildschirm, bis ich sie schließe. Können Sie eine neue Testanwendung auf Ihrem Computer erstellen und es dort versuchen? Vielleicht handelt es sich um etwas Spezifisches für Ihre Konfiguration oder Ihr Projekt. Wenn Sie es in einer neuen Anwendung durchführen würden, könnten wir feststellen, ob es an Ihrem Visual Studio oder Ihrem Computer liegt oder an Ihrer Anwendung selbst.

0 Stimmen

Hast du in deiner Test-App einen Splashscreen verwendet? Danke!!!

2 Stimmen

Ich vermute, dass dein Problem darin besteht, dass das WPF-Framework denkt, dass dein Splashscreen das Hauptformular ist und die App schließt, wenn es geschlossen wird. Aber ich kenne mich nicht mit WPF aus und kann daher nicht raten, wie man das untersuchen kann!

1voto

Andreas Kahler Punkte 2185

Alexey hat recht, der Begrüßungsbildschirm schließt das Nachrichtenfeld.

Ein einfacher Weg, dies zu vermeiden, besteht darin, die native MessageBox-Funktion zu verwenden:

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

public static void Main()
{
   ...
   MessageBox(new IntPtr(0), "Hallo Welt!", "MeineApp", 0);

0voto

Matt West Punkte 2834

Sie müssen WPF mitteilen, dass es nicht herunterfahren soll, wenn das erste Fenster geschlossen wird. Schauen Sie sich das an: http://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode.aspx. Sie möchten Ihre Anwendung explizit herunterfahren (anstatt nachdem das erste Fenster geschlossen wurde):

Ihre andere Möglichkeit ist es, Ihr MainWindow als StartupUri festzulegen (anstatt Ihres Splash-Screens) und dann Ihren Splash-Screen im Loaded-Ereignis des MainWindow zu laden. Anschließend würden Sie alles Laden oder zeitintensive Vorgänge durchführen, Ihren Splash-Screen ausblenden und Ihr Hauptfenster erneut zeigen.

0 Stimmen

Gut, die Anwendung wird nicht heruntergefahren; nur die MessageBox wird geschlossen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X