Comment définir WPF MessageBox.Owner à la fenêtre de bureau car SplashScreen ferme MessageBox

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

  •  05-09-2019
  •  | 
  •  

Question

J'utilise le Écran de démarrage Fonctionnalité dans WPF en définissant un bitmap Construire une action Pour éclater. Derrière l'écran Splash, les informations sur les licences sont en cours de contrôle, et en cas d'échec, j'affiche un Messagerie.

Selon ce Retour d'information, c'est parce que le MessageBox.Owner est l'écran Splash et dès qu'une autre fenêtre est ouverte même s'il s'agit d'une boîte de messagerie, la fenêtre d'écran Splash est fermée, ce qui ferme ensuite la boîte de message, donc l'utilisateur ne voit jamais la boîte de message.

Ainsi, la solution de contournement serait de définir le propriétaire de Messagebox.

Serait-il possible de définir le MessageBox.Owner sur la fenêtre de bureau? Et comment, parce que la seule autre fonction qui vient à l'esprit est le Getdesktopwindow () Fonction de l'API, mais cela renvoie une poignée de fenêtre et MessageBox.Owner est une fenêtre WPF.

Était-ce utile?

La solution 3

J'ai trouvé le problème. J'utilise également l'écran de Splash Back-In qui provoque ceci: WPF SplashScreen ferme MessageBox

Autres conseils

Étant donné que l'utilisation de la fenêtre de bureau comme parent de vos boîtes de dialogue modale n'est pas une bonne idée, comme @nir l'a souligné dans sa réponse, voici trois autres solutions de contournement:

1) Utilisez une fenêtre cachée. Créez une petite fenêtre non modale pour agir en tant que parent pour votre Messagebox ou une autre boîte de dialogue modale. Cette approche est décrite ici:

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

2) Créez des fenêtres de message non modal. Modifiez votre mode de démarrage en arrêt explicite et utilisez une fenêtre non modale pour afficher votre message. Cette approche est décrite dans la réponse à cette question StackOverflow:

Messagebox avec les détails de l'exception disparaît immédiatement si vous utilisez un écran de splash dans WPF 4.0

3) Appelez MessageBox deux fois. Apparemment, le problème n'affecte que la première boîte de dialogue modale indiquée. Vous pouvez donc simplement appeler votre boîte de dialogue modale deux fois, si cela ne vous dérangeait pas le flash de la première ouverture et fermeture.

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

Personnellement, je n'aime aucune de ces solutions de contournement. La seule autre option consiste à éviter la fonctionnalité intégrée de l'écran de splash et à rouler la vôtre à partir de zéro. Voici un lien si vous souhaitez enquêter davantage sur cette voie:

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

Enfin, si vous êtes aussi ennuyé par cette question que moi, vous pouvez voter pour Microsoft pour corriger ce bogue ici:

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

J'ai moi-même trouvé cette solution, alors peut-être qu'il y a quelque chose qui ne va pas, mais cela semble fonctionner parfaitement:

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);

Pouvez-vous publier du code? J'ai juste essayé d'ajouter cela au fichier app.xaml.cs dans une nouvelle application WPF:

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);
}

... Et cela fonctionne comme prévu (l'invite "Confirmer Start" reste ouverte jusqu'à ce que j'aie répondu, et si je clique sur "Non", l'application s'arrête).

La fenêtre de bureau n'est jamais le bon parent, lisez ceci pour savoir pourquoi:

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

Maintenant, le problème décrit dans cet article ne se produit pas tellement parce que MS a travaillé autour de lui, dans ce post, vous pouvez voir comment:

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

Cela m'a beaucoup aidé ..... m'a donné une nouvelle idée mais l'exemple de code que j'ai vu ici a une modification requise

Voici un exemple simple de WPF avec modification maintenant ça marche maintenant

sur le bouton cliquer

Collez ce code

if (System.Windows.Forms.MessageBox.show ("Are U Sure", "Delete", System.Windows.Forms.MessageBoxButtons.Yesno, System.Windows.Forms.MessageBoxIcon.Qtiontion) == System.Windows.Forms. DialOGResult.Yes) {this.close (); } else {messagebox.show ("Pourquoi ne pas supprimer"); }

Ce n'est pas directement lié à la situation de l'OP, mais pourrait être utile pour d'autres qui ont des problèmes avec Messagebox cachés derrière d'autres fenêtres dans certaines situations spéciales.

Comme le mentionne @Dthrasher, une solution consiste à utiliser une fenêtre factice cachée. Mais parfois même cela ne suffit pas. J'avais une situation où la solution était non seulement d'utiliser une fenêtre factice cachée, mais aussi d'allumer sa propriété la plus haute chaque fois que je l'utilisais avec MessageBox.

     _formKludge.TopMost = true;

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

     _formKludge.TopMost = false;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top