J'ai une application winforms qui n'a pas vraiment de formulaire principal - c'est juste un simple outil de gestion de fichiers donc elle n'en a pas vraiment besoin. Lorsque l'application démarre, un fichier OpenFileDialog est d'abord utilisé pour sélectionner un fichier. Ensuite, une boîte de dialogue est affichée en utilisant Showdialog() avec quelques options sur la façon dont le fichier sélectionné doit être traité. Enfin, une forme de barre de progression est affichée pendant l'exploitation du fichier et l'application se ferme. Le problème est que lorsque je débogue à partir de Visual Studio, le formulaire intermédiaire ne s'affiche pas au-dessus des autres fenêtres ouvertes, telles que Visual Studio lui-même. Quand je cours l'exécutable compilé cependant il semble fonctionner bien. Habituellement, lorsque ShowDialog aboutit à une boîte de dialogue, la solution consiste à utiliser l'appel Showdialog (owner), sauf que je n'ai pas de formulaire principal pour dire que je n'ai pas de propriétaire. ensemble. Alors, comment puis-je faire apparaître la boîte de dialogue au-dessus des autres fenêtres de la même manière que le fait automatiquement OpenFileDialog?Application Winforms sans formulaire principal - boîte de dialogue non affichée en haut
Répondre
Je sais exactement de quoi vous parlez et le problème est en fait avec la conception de votre application en désaccord avec la façon dont Windows gère la mise au point. Windows a fait ce genre de chose depuis win31. C'est comme un accaparement de terres; Si vous affichez une fenêtre depuis votre application, puis la masquer/la désactiver, Vous rappelez, vous perdez selon Bill. La solution: vous avez besoin d'une fenêtre principale! Ou basculez OS. Ce n'est pas parce qu'il fonctionne à partir d'un fichier EXE que cela fonctionnera quand un de vos utilisateurs le lancera à partir d'un fichier batch ou autre que l'explorateur.
Vous pouvez vous débrouiller pour sortir de cette - exécuter 3 exes distincts; essayez de tourner sur 3 threads Application.Run dans votre sous-main; utiliser pour SetTopMost, AppActivate vous-même. Ou cherchez comment amener votre application à saisir le focus d'entrée en utilisant les appels SDK - quelles versions successives de Windows ont rendu difficile afin d'atténuer les applications désagréables qui l'utilisent (par conséquent, une application qui pourrait le faire dans w98 fera clignoter la barre des tâches orange dans XP) - et puis les programmeurs ont travaillé autour de cela bien sûr. Tu pourrais le faire.
Mais vous le feriez mal. Un refactor est en ordre et change de stratégie pour les applications futures. Ce n'est pas une décision que j'ai prise; la façon dont les fenêtres fonctionnent est enchâssée dans la pierre, et la façon dont les utilisateurs s'attendent à ce que cela fonctionne est définie dans des millions de cerveaux, ce qui est plus difficile que la pierre - nager avec le flux!
refactor facile sans impact réel:
- Sauvegardez votre projet (ou SHELVE une copie TFS)
- Dans les options de dialogue, coupez toutes vos commandes. Mettez dans un panneau de taille de formulaire nommé pnlOpts. Collez-les en arrière.
- Faites de ce formulaire votre formulaire principal.
- Dans le form_shown, définissez pnlOpts.Visible = false, ou par défaut juste de cette façon (vous pouvez afficher un autre panneau w/le nom de l'application ou une image d'arrière-plan si vous voulez être un peu trash ;-)
- Appel le code d'installation qui affiche également le fichier dlg de cette zone ainsi
- Définissez votre fichier dlg pour avoir cette forme en tant que parent, la position de démarrage en tant que parent central (je veux dire le propriétaire n'est pas parent). Rappelez-vous d'annuler de ceci = fermer le formulaire de configuration
- Lorsque cela est fait, affichez pnlOpts.
- Dans le bouton OK, appelez le code qui exécute la barre de progression. Vous pouvez masquer ou désactiver pnlOpts ici encore. A aucun moment, vous ne pouvez masquer, définir Visible = false, ou enabled = false sur la fenêtre ENTIER ou vous invoquerez la colère focalisante de Windows (qui est la cause de votre misère ici).
La clé ici, la réponse d'une ligne: laisser une fenêtre principale visible et activée à tout moment, si vous souhaitez désactiver la fonctionnalité, tout gris ou cacher tous ses contrôles. c'est le plus facile à faire avec le panneau. Vous pouvez montrer à l'utilisateur d'autres panneaux ou images pour les divertir si vous le souhaitez (surtout si gris [.enabled = false] le contenu n'a pas de sens).
Vous n'aimerez pas ce look, ou vous l'auriez construit comme ça pour commencer, mais des millions de lignes de code Windows et des millions de cerveaux d'utilisateurs Windows sont passifs-agressivement en désaccord avec vous maintenant !
Une autre façon serait d'en faire une application console et d'utiliser la console pour le parent de ces autres objets. Ce sera plus facile mais beaucoup plus désagréable. Vous avez probablement déjà pensé au concept de la possibilité d'avoir une petite fenêtre principale toujours en arrière-plan. Un autre hack à ajouter à la liste serait de le faire et de l'avoir hors écran> :-) Mais Windows 8 va vérifier cela et vous punir. – FastAl
Soupir. Refacturé. –
Je sais, je sais ... J'ai été battu à la pulpe tant de fois par les fenêtres. Maintenant, j'agis comme une bonne petite prole et je joue juste avec. Soupir. – FastAl
"n'apparaît pas au-dessus des autres fenêtres" autres fenêtres de votre application ou de votre bureau? –
Mon application n'a pas d'autres fenêtres. L'appel ShowDialog résulte dans une boîte de dialogue qui vient derrière Visual Studio –