Comment utiliser un FolderBrowserDialog à partir d'une application WPF
Je suis en train d'utiliser le FolderBrowserDialog à partir de mon application WPF - rien de compliqué. Je n'ai pas beaucoup de soins qu'il a les Windows Forms pour elle.
Cependant, quand je l'appelle ShowDialog, j'ai envie de passer à la fenêtre du propriétaire qui est un IWin32Window. Comment puis-je obtenir ce à partir de mon contrôle WPF?
En fait, importe-t-il? Si j'exécute ce code et utiliser le ShowDialog surcharge sans paramètres, il fonctionne très bien. Dans quelles circonstances ai-je besoin pour passer à la fenêtre du propriétaire?
Merci,
Craig
- Découvrez Sven Groot est fantastique Ookii.Les boîtes de dialogue pour WinForms et WPF, qui vous donnent moderne "Vista" dossier de style et de boîtes de dialogue fichier.
Vous devez vous connecter pour publier un commentaire.
Et voici ma version finale.
Et de l'utiliser:
System.Windows.Interop
. Facile à étendre la solution pour une utilisation avecSystem.Windows.Forms.OpenFileDialog
. D'autres lecteurs - n'oubliez pas de vérifier la DialogResult s'assurer que l'utilisateur n'a pas cliqué sur le bouton Annuler.Si vous spécifiez Propriétaire, vous aurez une boîte de dialogue Modale sur la fenêtre WPF.
Pour obtenir WinForms compatible Win32 fenêtre créer une classe implémente IWin32Window comme ce
Et utiliser une instance de cette classe à votre WinForms
Je réalise que c'est une vieille question, mais ici, c'est une approche qui pourrait être un peu plus élégant (et peut ou peut ne pas avoir été disponible avant)...
Puis, à partir de votre fenêtre WPF, vous pouvez tout simplement...
Je ne sais pas si c'est important dans ce cas, mais en général, vous devez indiquer à Windows qu'est-ce que votre fenêtre de hiérarchie, de sorte que si un parent de la fenêtre est cliqué, tout enfant de la fenêtre est modale, Windows peut fournir un visuel (et éventuellement audible) indice de l'utilisateur.
Aussi, elle garantit le "droit" de la fenêtre est sur le dessus quand il y a plusieurs fenêtres modales (non pas que j'ai défends une telle conception de l'INTERFACE utilisateur). J'ai vu de l'Isu conçu par un certain multi-milliards de dollars corporation (shell qui restent sans nom), qui est pendu tout simplement parce que une boîte de dialogue modale est "coincé" en dessous de l'autre, et l'utilisateur n'a aucune idée qu'il était encore là, et encore moins comment le fermer.
using
directive?GetIWin32Window
y est défini comme une méthode d'extension, de sorte qu'il est accessible automatiquement à partir de la deuxième extrait sansusing
(en supposant que les deux extraits sont dans le même projet).OK, compris, maintenant - grâce à Jobi dont la réponse était proche, mais pas tout à fait.
À partir d'une application WPF, voici mon code qui fonctionne:
D'abord une classe helper:
Ensuite, pour utiliser ce:
Je suis sûr que je peux conclure de mieux, mais fondamentalement, il fonctionne. Yay!!! 🙂
VB.net traduction
L'avantage de passage d'un propriétaire de la poignée est que le FolderBrowserDialog ne sera pas modale de la fenêtre. Cela évite à l'utilisateur d'interagir avec votre fenêtre principale de l'application, tandis que la boîte de dialogue est active.
Vous devriez être en mesure d'obtenir un IWin32Window en utilisant PresentationSource.FromVisual et le casting du résultat de HwndSource qui implémente IWin32Window.
Également dans les commentaires ici:
Pourquoi ne pas utiliser le construit en WindowInteropHelper classe (voir l'espace de noms System.De Windows.Interop). Cette classe déjà impelements la IWin32Window 😉
De sorte que vous pouvez oublier les "OldWindow classe" ... l'utilisation reste la même
Voici une méthode simple.