So setzen Sie WPF MessageBox.besitzer im Desktop -Fenster, da Splashscreen MessageBox schließt

StackOverflow https://stackoverflow.com/questions/576503

  •  05-09-2019
  •  | 
  •  

Frage

Ich benutze das Begrüßungsbildschirm Feature in WPF durch Einstellen eines Bitmaps Aktion aufbauen zum Spritzencreen. Hinter dem Begrüßungsbildschirm wird die Lizenzinformationen überprüft, und wenn sie fehlschlagen, zeige ich a Nachrichtenbox.

Demzufolge Feedback, Es liegt daran, dass der MessageBox.besitzer der Begrüßungsbildschirm ist und sobald ein anderes Fenster geöffnet ist, auch wenn es sich um eine MessageBox handelt, ist das Scheinbildfenster geschlossen, das dann wiederum die MessageBox schließt, sodass der Benutzer nie das MessageBox sieht.

Die Problemumgehung würde also darin bestehen, den MessageBox in ein anderes Fenster zu setzen, aber das würde bedeuten, dass ich ein anderes Fenster instanziieren muss, das möglicherweise nicht einmal benötigt wird.

Wäre es möglich, den MessageBox.besitzer auf das Desktop -Fenster einzustellen? Und wie, weil die einzige andere Funktion, die mir in den Sinn kommt, die ist GetDesktopWindow () API -Funktion, aber das gibt einen Fenstergriff und eine MessageBox zurück. Eigentümer ist ein WPF -Fenster.

War es hilfreich?

Lösung 3

Ich fand das Problem. Ich benutze auch den Build-In-Begrüßungsbildschirm, der dies verursacht: WPF Splashscreen schließt MessageBox

Andere Tipps

Da die Verwendung des Desktop -Fensters als Elternteil für Ihre modalen Dialoge keine gute Idee ist, wie @nir in seiner Antwort hervorgeht, sind hier drei weitere Problemumgehungen:

1) Verwenden Sie ein verstecktes Fenster. Erstellen Sie ein winziges, nicht modales Fenster, um als übergeordnetes für Ihr MessageBox oder einen anderen modalen Dialog zu fungieren. Dieser Ansatz wird hier beschrieben:

http://social.msdn.microsoft.com/forums/en-us/wpf/thread/116bcd83-93bf-42f3-9bfe-da9e7de37546/

2) Erstellen Sie nicht modale Nachrichtenfenster. Ändern Sie Ihren Startmodus auf explizites Abschalten und verwenden Sie ein nicht modales Fenster, um Ihre Nachricht anzuzeigen. Dieser Ansatz wird in der Antwort auf diese Frage der Stackoverflow beschrieben:

MessageBox mit Ausnahmedetails verschwindet sofort, wenn Sie den Scheinbildschirm in WPF 4.0 verwenden

3) Call MessageBox zweimal. Offensichtlich wirkt sich das Problem nur auf den angezeigten ersten modalen Dialogfeld aus. Sie können also einfach zweimal Ihren modalen Dialog anrufen, wenn es Ihnen nichts ausmachte, den Blitz des ersten Öffnungen und Schließens.

https://connect.microsoft.com/visualstudio/feedback/details/600197/wpf-lash-screen-dismisses-dialog-box

Persönlich mag ich keine dieser Problemumgehungen. Die einzige andere Option besteht darin, die integrierte Spritzbild-Funktionalität zu vermeiden und Ihre eigenen von Grund auf neu zu rollen. Hier ist ein Link, wenn Sie diese Route weiter untersuchen möchten:

http://social.msdn.microsoft.com/forums/en-us/wpf/thread/8dd49fd0-9cc9-43c6-b285-6f119ab8a32e/

Wenn Sie über dieses Problem genauso verärgert sind wie ich, können Sie für Microsoft stimmen, um diesen Fehler hier zu beheben:

http://connect.microsoft.com/visualstudio/feedback/details/600197/wpf-lash-screen-dismisses-dialog-box

Ich habe mir diese Lösung selbst ausgedacht, also stimmt vielleicht etwas nicht damit, aber es scheint perfekt zu funktionieren:

Window temp = new Window() { Visibility=Visibility.Hidden };
temp.Show();
MessageBox.Show(temp, "An error occurred before the application could start.\n\nTechnical Details: " + ex.Message, "Fatal Error", MessageBoxButton.OK, MessageBoxImage.Stop);
App.Current.Shutdown(1);

Können Sie einen Code posten? Ich habe gerade versucht, dies in eine neue WPF -Anwendung zur Datei app.xaml.cs hinzuzufügen:

protected override void OnStartup(StartupEventArgs e)
{
    if (MessageBox.Show("Start app?", "Confirm Start", 
        MessageBoxButton.YesNo) == MessageBoxResult.No)
    {
        this.Shutdown();
        return;
    }

    this.StartupUri = new Uri("Window1.xaml", UriKind.Relative);
    base.OnStartup(e);
}

... und es funktioniert wie erwartet (die Eingabeaufforderung "Start“ bleibt geöffnet, bis ich geantwortet habe, und wenn ich auf "Nein" klicke, wird die App geschaltet).

Das Desktop -Fenster ist nie das richtige Elternteil. Lesen Sie dies, um zu wissen, warum:

http://blogs.msdn.com/oldnewing/archive/2004/02/24/79212.aspx

Jetzt ist das in diesem Beitrag beschriebene Problem nicht so sehr, weil MS in diesem Beitrag herumgearbeitet hat. In diesem Beitrag können Sie sehen, wie:

http://blogs.msdn.com/oldnewing/archive/2006/11/02/931674.aspx

Dies hat mir sehr geholfen ..... habe mir eine neue Idee gegeben, aber der Beispielcode, den ich hier gesehen habe, hat eine gewisse Änderung erforderlich

Hier ist ein einfaches Beispiel in WPF mit Modifikation jetzt funktioniert es

Auf Schaltfläche Klicken Sie auf

Fügen Sie diesen Code ein

if (system.windows.forms.messagebox.show ("sind u sicher", "delete", system.windows.forms.messageboxbuttons.yesno, system.windows.forms.messageBoxicon.question) == System.Windows.fors. DialOgresult.yes) {this.close (); } else {messageBox.show ("Warum nicht löschen"); }

Dies hängt nicht direkt mit der Situation des OP zusammen, könnte aber für andere nützlich sein, die Probleme haben, dass MessageBox in bestimmten besonderen Situationen hinter anderen Fenstern verborgen ist.

Wie @dthrasher erwähnt, besteht eine Lösung darin, ein verstecktes Dummy -Fenster zu verwenden. Aber manchmal ist selbst das nicht genug. Ich hatte eine Situation, in der die Lösung darin bestand, nicht nur ein verstecktes Dummy -Fenster zu verwenden, sondern ihre oberste Eigenschaft einzuschalten, wenn ich es mit MessageBox verwendet habe.

     _formKludge.TopMost = true;

     MessageBox.Show(_formKludge, "Nice informative message.", "Super-duper Program",
                     MessageBoxButtons.OK, MessageBoxIcon.Error);

     _formKludge.TopMost = false;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top