...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!
0 Stimmen
Okay, ich habe gerade eine Dummy-App mit einem Splash-Screen erstellt, der bewirkt, dass die Nachrichtenbox verschwindet. :(
0 Stimmen
@David - Die App schließt sich nicht, nur die Nachrichtenbox. :( Ich denke, ich muss mich weiter mit dem SplashScreen beschäftigen. >__>
0 Stimmen
Wird Ihr Splash-Screen noch auf dem Bildschirm angezeigt, wenn die MessageBox angezeigt wird? Versuchen Sie, eine Überladung zu verwenden, die den Parameter
IWin32Window
akzeptiert, und übergeben Sie den WertNull
, um Ihre MessageBox zu einem Top-Level-Fenster Ihrer Anwendung zu machen, das unabhängig von allen anderen möglichen Fenstern ist.1 Stimmen
Einige Workarounds wurden hier gefunden: connect.microsoft.com/VisualStudio/feedback/details/600197/… Ich werde sehen, welcher mir am meisten Glück bringt. (EDIT - sie alle scheinen jedoch wie Hacks aussehen :( )
0 Stimmen
@Alexey - Ja, für den letzten Teil der Zeit ist es so, als ob sie beide gleichzeitig verschwinden.
0 Stimmen
@townsean Und das macht Sinn. Ich vermute, dass Ihr MessageBox vom Splashscreen-Formular übernommen wird. Wenn der Splashscreen geschlossen ist, schließt das Framework das MessageBox. Daher sollte es funktionieren, wenn Sie Ihr MessageBox ohne Besitzer machen. (Ich bin nicht geübt in .net, nur in nativem Win32.)
0 Stimmen
@Alexey - Nachdem ich mich über die Window.Owner-Eigenschaft informiert habe, ergibt das viel Sinn. Ich habe herausgefunden, dass es eine Überladung der Show-Methode gibt, die es mir ermöglicht, den Besitzer anzugeben. Danke!!! :)
0 Stimmen
Jetzt habe ich überlegt...bei dem Hack, bei dem ich zwei identische MessageBoxes aufrufe und die erste schließt, aber die zweite geöffnet bleibt, wer ist der Fensterbesitzer? In meiner Anwendung wurde noch kein weiteres Fenster erstellt. Also war ich nur neugierig.
0 Stimmen
@townsean Du kannst das Spyxx-Dienstprogramm von Visual Studio verwenden, um das herauszufinden. Es wird dir den Besitzer anzeigen. (Dieses Dienstprogramm ist nicht .NET-spezifisch, aber es ist sehr hilfreich, wenn du die Fenster-Hierarchie verstehen möchtest.)