2009-02-23 7 views
9

J'utilise le SplashScreen fonctionnalité dans WPF en mettant l'action de construction d'un bitmap à Splashscreen. Derrière l'écran de démarrage, les informations de licence sont en cours de vérification, et en cas d'échec, je montre un MessageBox. Selon ce Feedback, c'est parce que le MessageBox.Owner est l'écran de démarrage et dès qu'une autre fenêtre est ouverte, même s'il s'agit d'un MessageBox, la fenêtre de démarrage est fermée, ce qui ferme à son tour le MessageBox, donc le l'utilisateur ne voit jamais le MessageBox. Donc la solution de contournement serait de définir le MessageBox.Owner à une autre fenêtre, mais cela signifierait que je dois instancier une autre fenêtre qui pourrait même ne pas être nécessaire.comment configurer WPF MessageBox.Owner à la fenêtre de bureau parce SplashScreen ferme MessageBox

Serait-il possible de définir le MessageBox.Owner à la fenêtre du bureau? Et comment, parce que la seule autre fonction qui vient à l'esprit est la fonction GetDesktopWindow() api, mais cela renvoie un handle de fenêtre et MessageBox.Owner est une fenêtre WPF.

Répondre

4

J'ai trouvé le problème. Je suis également en utilisant l'écran de démarrage accumulation qui provoque ceci: WPF SplashScreen closes MessageBox

+0

La question serait maintenant comment définiriez-vous le propriétaire de la MessageBox à la fenêtre deskop? – adriaanp

1

Pouvez-vous poster du code? Je viens essayé d'ajouter ceci 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 il fonctionne comme prévu (le « confirm Start » reste ouverte jusqu'à ce que je invite ai répondu, et si je clique sur "Non", l'application s'arrête).

+0

Matt, je l'ai également testé comme vous l'avez fait et a réalisé qu'il fonctionne, parce que je travaillais avec un écran de démarrage, il ferme la MessageBox, sans l'écran de démarrage, il n'a pas fermé – adriaanp

+0

donc je suppose que maintenant vous devez décider si la question doit être classée comme «n'est plus pertinent» ou (comme le suggère @adriaanp dans son commentaire), la retravailler comme une question différente. –

0

cela m'a beaucoup aidé ..... me donné une nouvelle idée mais le code exemple que je l'ai vu ici a une modification nécessaire

ici est un exemple simple WPF avec modification maintenant il travaille

sur le bouton cliquez

coller ce code

si (System.Windows.Forms.MessageBox.Show ("êtes-vous sûr", "delete", System.Windows.Forms.BaseBoxButtons.YesNo, System.Windows.Forms.BaseMicrosoft.Question) == System .Windows.Forms.DialogResult.Yes) { this.Close(); } sinon { MessageBox.Montrer ("pourquoi ne pas supprimer"); }

9

Depuis l'aide de la fenêtre du bureau comme parent pour vos boîtes de dialogue modales est pas une bonne idée, comme @Nir a souligné dans sa réponse, voici trois autres solutions de contournement:

1) Utilisez une fenêtre masquée. Créez une fenêtre minuscule 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éer des fenêtres de message non modal. Changez votre mode de démarrage à l'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 with exception details immediately disappears if use splash screen in WPF 4.0

3) Appeler MessageBox deux fois. Apparemment, le problème affecte seulement la première boîte de dialogue modale montrée. Ainsi, vous pouvez simplement appeler deux fois votre boîte de dialogue modale, si le flash de la première ouverture et fermeture ne vous dérange pas.

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

Personnellement, je n'aime pas l'une de ces solutions de contournement. La seule autre option est d'éviter la fonctionnalité intégrée de SplashScreen et de rouler la vôtre à partir de zéro. Voici un lien si vous voulez enquêter sur cette route plus loin:

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

Enfin, si vous êtes aussi agacé par cette question que je suis, vous pouvez voter pour Microsoft pour corriger ce bug ici:

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

8

je suis venu avec cette solution moi-même, alors peut-être il y a quelque chose de mal avec elle, mais il 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); 
+2

Solution de contournement agréable et simple. Cependant, le 'Visibility = Visibility.Hidden' n'est pas vraiment nécessaire, car vous allez montrer la fenêtre de toute façon. Au lieu de cela, afin d'éviter l'affichage de la fenêtre d'arrière-plan, j'ai utilisé: 'nouvelle fenêtre {WindowState = WindowState.Minimized, ShowInTaskbar = false}' – splintor

+0

'nouvelle fenêtre {AllowsTransparency = true, ShowInTaskbar = false, WindowStyle = WindowStyle.None , Background = Brushes.Transparent} 'peut rendre la fenêtre complètement cachée tandis que le réglage de la visibilité ou de l'état de la fenêtre provoquera l'affichage de la fenêtre pendant quelques millisecondes lorsque' Show() 'est invoqué. – kiran

0

Ceci n'est pas directement lié à la situation de l'OP, mais peut être utile pour d'autres personnes qui ont des problèmes avec MessageBox caché derrière d'autres fenêtres dans certaines situations spéciales. Comme @dthrasher mentionne, une solution consiste à utiliser une fenêtre fictive cachée. Mais parfois même cela ne suffit pas. J'ai eu une situation où la solution était non seulement d'utiliser une fenêtre fictive cachée, mais pour activer sa propriété TopMost 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; 
Questions connexes