Wenn Sie in VS .NET einen Ordner für ein Projekt auswählen, wird ein Dialogfeld angezeigt, das wie ein OpenFileDialog oder SaveFileDialog aussieht, jedoch so eingerichtet ist, dass nur Ordner akzeptiert werden. Seit ich das gesehen habe, wollte ich wissen, wie es gemacht wird. Ich kenne den FolderBrowserDialog, aber dieser Dialog hat mir nie wirklich gefallen. Es fängt zu klein an und lässt mich nicht ausnutzen, einen Pfad eingeben zu können.
Ich bin mir fast sicher, dass es in .NET keine Möglichkeit gibt, dies zu tun, aber ich bin genauso neugierig, wie Sie dies auch mit nicht verwaltetem Code tun. Wie können Sie den Dialog so ändern, dass er dieses Verhalten aufweist, ohne den Dialog von Grund auf neu zu implementieren?
Ich möchte auch noch einmal betonen, dass mir der FolderBrowserDialog bekannt ist, aber manchmal möchte ich ihn nicht verwenden, und ich bin wirklich neugierig, wie man einen Dialog auf diese Weise konfiguriert. Wenn ich nur den FolderBrowserDialog verwenden soll, kann ich eine konsistente Benutzeroberfläche beibehalten, aber meine Neugier nicht befriedigen, sodass dies nicht als Antwort gilt.
Es ist auch keine Vista-spezifische Sache; Ich habe diesen Dialog seit VS .NET 2003 gesehen, daher ist er in Win2k und WinXP möglich. Dies ist weniger eine Frage "Ich möchte wissen, wie man das richtig macht" als eine Frage "Ich war neugierig, seit ich es zum ersten Mal in VS 2003 machen wollte". Ich verstehe, dass der Dateidialog von Vista eine Option bietet, aber er funktioniert unter XP, sodass ich weiß, dass sie etwas getan haben , um ihn zum Laufen zu bringen. Vista-spezifische Antworten sind keine Antworten, da Vista im Fragenkontext nicht vorhanden ist.
Update: Ich akzeptiere die Antwort von Scott Wisniewski, weil sie ein funktionierendes Beispiel enthält, aber ich denke, Serge verdient Anerkennung dafür, dass er auf die Dialoganpassung (die zwar von .NET unangenehm ist, aber funktioniert) und Mark Ransom für das Herausfinden dieser MS Wahrscheinlich wurde ein benutzerdefinierter Dialog für diese Aufgabe erstellt.
quelle
dialog.FileName = "Folder Selection"
solldialog.FileName = "Folder Selection."
mit der Nachlaufzeit sein? Trotzdem kann ich es beim zweiten Klick auf "Öffnen" nicht in Powershell zum Laufen bringen. Es wird immer wieder gesagt, dass die Datei nicht gefunden wurde, obwohl CheckFileExists angeblich falsch istdialog.CheckFileExists = 0
statt falsch löste mein ProblemAntworten:
Ich habe ein von mir geschriebenes Dialogfeld namens OpenFileOrFolder-Dialogfeld, in dem Sie entweder einen Ordner oder eine Datei öffnen können.
Wenn Sie den Wert für AcceptFiles auf false setzen, wird nur der Modus zum Akzeptieren von Ordnern ausgeführt.
Sie können die Quelle von GitHub hier herunterladen
quelle
Sie können FolderBrowserDialogEx verwenden - eine wiederverwendbare Ableitung des integrierten FolderBrowserDialog. Mit diesem können Sie einen Pfad eingeben, sogar einen UNC-Pfad. Sie können damit auch nach Computern oder Druckern suchen. Funktioniert genau wie die eingebaute FBD, aber ... besser.
(BEARBEITEN: Ich hätte darauf hinweisen sollen, dass in diesem Dialogfeld Dateien oder Ordner ausgewählt werden können.)
Vollständiger Quellcode (ein kurzes C # -Modul). Frei. MS-Public Lizenz.
Code zur Verwendung:
quelle
Es gibt das Windows API Code Pack. Es gibt viele Shell-bezogene Dinge, einschließlich der
CommonOpenFileDialog
Klasse (imMicrosoft.WindowsAPICodePack.Dialogs
Namespace). Dies ist die perfekte Lösung - der übliche offene Dialog, in dem nur Ordner angezeigt werden.Hier ist ein Beispiel für die Verwendung:
Leider wird dieses Paket von Microsoft nicht mehr ausgeliefert, aber mehrere Personen haben inoffiziell Binärdateien auf NuGet hochgeladen. Ein Beispiel finden Sie hier . Dieses Paket ist nur das Shell-spezifische Zeug. Falls Sie es benötigen, verfügt derselbe Benutzer über mehrere andere Pakete, die mehr Funktionen im Originalpaket bieten.
quelle
Das Ookii.Dialogs- Paket enthält einen verwalteten Wrapper um den neuen Ordnerdialog (im Vista-Stil). Es verschlechtert sich auch auf älteren Betriebssystemen.
quelle
OpenFileDialog
Ordner-Dialog im Stil wünschen .Verwenden Sie dafür besser den FolderBrowserDialog.
quelle
Nach stundenlangem Suchen fand ich diese Antwort von leetNightShade auf eine funktionierende Lösung .
Es gibt drei Dinge, von denen ich glaube, dass sie diese Lösung viel besser machen als alle anderen.
Laden Sie den Code hier herunter .
quelle
Exakte Audiokopie funktioniert unter Windows XP auf diese Weise. Das Standarddialogfeld zum Öffnen von Dateien wird angezeigt, aber das Feld Dateiname enthält den Text "Dateiname wird ignoriert".
Ich rate hier nur, aber ich vermute, dass die Zeichenfolge jedes Mal in das Bearbeitungssteuerelement des Kombinationsfelds eingefügt wird, wenn eine wesentliche Änderung am Dialogfeld vorgenommen wird. Solange das Feld nicht leer ist und die Dialogflags so eingestellt sind, dass die Existenz der Datei nicht überprüft wird, kann der Dialog normal geschlossen werden.
Edit: das ist viel einfacher als ich dachte. Hier ist der Code in C ++ / MFC, den Sie in die Umgebung Ihrer Wahl übersetzen können.
Bearbeiten 2: Dies sollte die Übersetzung in C # sein, aber ich spreche nicht fließend C #, also erschieß mich nicht, wenn es nicht funktioniert.
Bearbeiten 3: Schließlich wurde der betreffende Dialog in Visual Studio 2005 betrachtet (ich hatte zuvor keinen Zugriff darauf). Es ist nicht der Standarddialog zum Öffnen von Dateien! Wenn Sie die Fenster in Spy ++ überprüfen und mit einer geöffneten Standarddatei vergleichen, werden Sie feststellen, dass die Struktur- und Klassennamen nicht übereinstimmen. Wenn Sie genau hinschauen, können Sie auch einige Unterschiede zwischen den Inhalten der Dialoge feststellen. Mein Fazit ist, dass Microsoft das Standarddialogfeld in Visual Studio vollständig ersetzt hat, um ihm diese Funktion zu geben. Meine Lösung oder ähnliches wird so nah wie möglich sein, es sei denn, Sie sind bereit, Ihre eigene von Grund auf neu zu codieren.
quelle
OK, lassen Sie mich versuchen, den ersten Punkt zu verbinden ;-) Wenn Sie ein wenig mit Spy ++ oder Winspector spielen, wird angezeigt, dass das Textfeld Ordner im VS-Projektspeicherort eine Anpassung des Standarddialogs ist. Es ist nicht dasselbe Feld wie das Dateinamen-Textfeld in einem Standarddatendialog wie dem im Editor.
Von da an versteckt VS die Dateinamen- und Dateityp-Textfelder / Comboboxen und verwendet eine benutzerdefinierte Dialogvorlage, um einen eigenen Teil am unteren Rand des Dialogfelds hinzuzufügen.
BEARBEITEN: Hier ist ein Beispiel für eine solche Anpassung und wie sie durchgeführt wird (in Win32, nicht in .NET):
m_ofn ist die OPENFILENAME-Struktur, die dem Dateidialog zugrunde liegt. Fügen Sie diese 2 Zeilen hinzu:
Dabei ist IDD_FILEDIALOG_IMPORTXLIFF eine benutzerdefinierte Dialogvorlage, die am unteren Rand des Dialogfelds hinzugefügt wird. Siehe den Teil in rot unten. (Quelle: apptranslator.com )
In diesem Fall ist das benutzerdefinierte Teil nur eine Beschriftung + ein Hyperlink, es kann sich jedoch um einen beliebigen Dialog handeln. Es könnte eine OK-Schaltfläche enthalten, mit der wir nur die Ordnerauswahl überprüfen können.
Aber wie wir einige der Steuerelemente im Standardteil des Dialogs entfernen würden, weiß ich nicht.
Weitere Details in diesem MSDN-Artikel .
quelle
Sie können den Dateidialog in Unterklassen unterteilen und Zugriff auf alle Steuerelemente erhalten. Jeder hat eine Kennung, mit der sein Fensterhandle abgerufen werden kann. Sie können sie dann ein- und ausblenden, Nachrichten über Auswahländerungen usw. usw. von ihnen erhalten. Es hängt alles davon ab, wie viel Aufwand Sie unternehmen möchten.
Wir haben die WTL-Klassenunterstützung verwendet und den Dateidialog so angepasst, dass er eine benutzerdefinierte Platzierungsleiste und Plug-in-COM-Ansichten enthält.
MSDN enthält Informationen dazu unter Verwendung von Win32. Dieser CodeProject-Artikel enthält ein Beispiel und dieser CodeProject-Artikel enthält ein .NET-Beispiel .
quelle
Sie können Code wie diesen verwenden
Um das Ausblenden des Textfelds für den Dateinamen zu erweitern, müssen Sie sich OpenFileDialogEx ansehen
Der Code:
quelle
Ich nehme an, Sie verwenden Vista mit VS2008? In diesem Fall denke ich, dass die Option FOS_PICKFOLDERS verwendet wird, wenn der Vista- Dateidialog IFileDialog aufgerufen wird . Ich befürchte, dass dies in .NET-Code viel knorrigen P / Invoke-Interop-Code beinhalten würde, um zu funktionieren.
quelle
Erste Lösung
Ich habe dies als bereinigte Version des Ordnerauswahldialogs im .NET Win 7-Stil von Bill Seddon von lyquidity.com entwickelt (ich habe keine Zugehörigkeit). (Ich habe von seinem Code aus einer anderen Antwort auf dieser Seite erfahren ). Ich habe meine eigene geschrieben, weil seine Lösung eine zusätzliche Reflection-Klasse erfordert, die für diesen fokussierten Zweck nicht benötigt wird, eine ausnahmebasierte Flusssteuerung verwendet und die Ergebnisse ihrer Reflection-Aufrufe nicht zwischenspeichert. Beachten Sie, dass die verschachtelte statische
VistaDialog
Klasse so ist, dass ihre statischen Reflexionsvariablen nicht versuchen, gefüllt zu werden, wenn dieShow
Methode nie aufgerufen wird. Es wird auf das Dialogfeld vor Vista zurückgegriffen, wenn die Windows-Version nicht hoch genug ist. Sollte unter Windows 7, 8, 9, 10 und höher (theoretisch) funktionieren.Es wird wie folgt in einem Windows Form verwendet:
Sie können natürlich mit den Optionen und den verfügbaren Eigenschaften herumspielen. Beispielsweise ermöglicht es die Mehrfachauswahl im Dialogfeld im Vista-Stil.
Zweite Lösung
Simon Mourier gab eine Antwort , die zeigt, wie genau derselbe Job mit Interop direkt gegen die Windows-API ausgeführt werden kann, obwohl seine Version ergänzt werden müsste, um den älteren Dialog zu verwenden, wenn er in einer älteren Windows-Version verwendet wird. Leider hatte ich seinen Posten noch nicht gefunden, als ich meine Lösung ausgearbeitet hatte. Nennen Sie Ihr Gift!
quelle
Probieren Sie dieses von Codeproject aus (Gutschrift an Nitron):
Ich denke, es ist der gleiche Dialog, über den Sie sprechen - vielleicht würde es helfen, wenn Sie einen Screenshot hinzufügen?
quelle
Unter Vista können Sie IFileDialog mit dem Optionssatz FOS_PICKFOLDERS verwenden. Dadurch wird ein OpenFileDialog-ähnliches Fenster angezeigt, in dem Sie Ordner auswählen können:
Bei älteren Windows können Sie bei der Auswahl einer beliebigen Datei im Ordner immer auf Tricks zurückgreifen.
Ein Arbeitsbeispiel für .NET Framework 2.0 und höher finden Sie hier .
quelle
Sie können Code wie diesen verwenden
Der Filter ist eine leere Zeichenfolge. Der Dateiname ist AnyName, aber nicht leer
quelle
Die Ookii Dialogs for WPF- Bibliothek verfügt über eine Klasse, die die Implementierung eines Ordnerbrowser- Dialogfelds für WPF bereitstellt.
Es gibt auch eine Version, die mit Windows Forms funktioniert .
quelle
Ich weiß, dass die Frage bei der Konfiguration von war,
OpenFileDialog
aber da Google mich hierher gebracht hat, kann ich auch darauf hinweisen, dass Sie, wenn Sie NUR nach Ordnern suchen, stattdessen ein verwenden sollten,FolderBrowserDialog
wie von einer anderen SO-Frage unten beantwortetWie kann ich den Pfad mithilfe des Dialogfelds "Datei öffnen" in vb.net angeben?
quelle