Abrir el diálogo del directorio

Quiero que el usuario seleccione un directorio donde se guardará un archivo que luego generaré. Sé que en WPF debería usar OpenFileDialog desde Win32, pero desafortunadamente el diálogo requiere que se seleccionen los archivos; permanece abierto si simplemente hago clic en Aceptar sin elegir uno. Podría “piratear” la funcionalidad permitiendo al usuario elegir un archivo y luego quitarle la ruta para descubrir a qué directorio pertenece, pero eso no es intuitivo en el mejor de los casos. ¿Alguien ha visto esto hecho antes?

Puede usar la clase integrada FolderBrowserDialog para esto. No importa que esté en el espacio de nombres System.Windows.Forms .

 using (var dialog = new System.Windows.Forms.FolderBrowserDialog()) { System.Windows.Forms.DialogResult result = dialog.ShowDialog(); } 

Si desea que la ventana sea modal sobre alguna ventana WPF, consulte la pregunta Cómo usar un FolderBrowserDialog desde una aplicación WPF .


EDITAR: si quieres algo un poco más elegante que el simple y feo Windows Forms FolderBrowserDialog, hay algunas alternativas que te permiten usar el cuadro de diálogo Vista en su lugar:

  • Bibliotecas de terceros, como los diálogos de Ookii (.NET 3.5)
  • El paquete API de código API de Windows :

     using Microsoft.WindowsAPICodePack.Dialogs; ... var dialog = new CommonOpenFileDialog(); dialog.IsFolderPicker = true; CommonFileDialogResult result = dialog.ShowDialog(); 

    Tenga en cuenta que este cuadro de diálogo no está disponible en sistemas operativos anteriores a Windows Vista, así que asegúrese de verificar primero CommonFileDialog.IsPlatformSupported .

Creé un UserControl que se usa así:

   

La fuente xaml se ve así:

       

y el código detrás

 public partial class FolderEntry { public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(FolderEntry), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public static DependencyProperty DescriptionProperty = DependencyProperty.Register("Description", typeof(string), typeof(FolderEntry), new PropertyMetadata(null)); public string Text { get { return GetValue(TextProperty) as string; } set { SetValue(TextProperty, value); }} public string Description { get { return GetValue(DescriptionProperty) as string; } set { SetValue(DescriptionProperty, value); } } public FolderEntry() { InitializeComponent(); } private void BrowseFolder(object sender, RoutedEventArgs e) { using (FolderBrowserDialog dlg = new FolderBrowserDialog()) { dlg.Description = Description; dlg.SelectedPath = Text; dlg.ShowNewFolderButton = true; DialogResult result = dlg.ShowDialog(); if (result == System.Windows.Forms.DialogResult.OK) { Text = dlg.SelectedPath; BindingExpression be = GetBindingExpression(TextProperty); if (be != null) be.UpdateSource(); } } } } 

Estoy usando diálogos de Ookii por un tiempo y funciona bien para WPF.

Aquí está la página directa:

http://www.ookii.org/Blog/new_download_ookiidialogs

Para que el cuadro de diálogo Directorio obtenga la ruta del directorio, primero agregue la referencia System.Windows.Forms, y luego resuelva, y luego coloque este código en un clic del botón.

  var dialog = new FolderBrowserDialog(); dialog.ShowDialog(); folderpathTB.Text = dialog.SelectedPath; 

(folderpathTB es el nombre de TextBox donde wana puso la ruta de la carpeta, O puede asignarlo a una variable de cadena también, es decir)

  string folder = dialog.SelectedPath; 

Y si tienes wana get FileName / path, simplemente hazlo en Button Click

  FileDialog fileDialog = new OpenFileDialog(); fileDialog.ShowDialog(); folderpathTB.Text = fileDialog.FileName; 

(folderpathTB es el nombre de TextBox donde wana puso la ruta del archivo, O puede asignarlo a una variable de cadena también)

Nota: Para el cuadro de diálogo Carpeta, System.Windows.Forms.dll debe agregarse al proyecto; de lo contrario, no funcionaría.

Encontré el siguiente código en el siguiente enlace … y funcionó Seleccionar carpeta de diálogo WPF

 using Microsoft.WindowsAPICodePack.Dialogs; var dlg = new CommonOpenFileDialog(); dlg.Title = "My Title"; dlg.IsFolderPicker = true; dlg.InitialDirectory = currentDirectory; dlg.AddToMostRecentlyUsedList = false; dlg.AllowNonFileSystemItems = false; dlg.DefaultDirectory = currentDirectory; dlg.EnsureFileExists = true; dlg.EnsurePathExists = true; dlg.EnsureReadOnly = false; dlg.EnsureValidNames = true; dlg.Multiselect = false; dlg.ShowPlacesList = true; if (dlg.ShowDialog() == CommonFileDialogResult.Ok) { var folder = dlg.FileName; // Do something with selected folder string } 

La mejor manera de lograr lo que desea es crear su propio control basado en wpf, o usar uno que haya sido creado por otras personas
por qué ? porque habrá un impacto notable en el rendimiento cuando se use el diálogo winforms en una aplicación wpf (por alguna razón)
yo recomiendo este proyecto
https://opendialog.codeplex.com/
o Nuget:

 PM> Install-Package OpenDialog 

es muy amigable con MVVM y no está envolviendo el diálogo de winforms

El diálogo de la carpeta Ookii se puede encontrar en Nuget.

PM> Install-Package Ookii.Dialogs

Y, el código de ejemplo es el siguiente.

 var dialog = new Ookii.Dialogs.Wpf.VistaFolderBrowserDialog(); if (dialog.ShowDialog(this).GetValueOrDefault()) { textBoxFolderPath.Text = dialog.SelectedPath; } 

El Ookii VistaFolderBrowserDialog es el que desea.

Si solo desea el Explorador de carpetas de Ooki Dialogs y nada más, descargue el Origen , seleccione con cuidado los archivos que necesita para el Explorador de carpetas (sugerencia: 7 archivos) y comstack bien en .NET 4.5.2. Tuve que agregar una referencia a System.Drawing . Compare las referencias en el proyecto original con las suyas.

¿Cómo averiguas qué archivos? Abra su aplicación y Ookii en diferentes instancias de Visual Studio. Agregue VistaFolderBrowserDialog.cs a su aplicación y continúe agregando archivos hasta que los errores de comstackción desaparezcan. Encuentra las dependencias en el proyecto Ookii – Control: haga clic en la que desea volver a su origen (juego de palabras intencionado).

Estos son los archivos que necesita si es demasiado vago para hacer eso …

 NativeMethods.cs SafeHandles.cs VistaFolderBrowserDialog.cs \ Interop COMGuids.cs ErrorHelper.cs ShellComInterfaces.cs ShellWrapperDefinitions.cs 

Edite la línea 197 en VistaFolderBrowserDialog.cs menos que desee incluir sus Resources.Resx

lanzar nueva InvalidOperationException (Properties.Resources.FolderBrowserDialogNoRootFolder);

 throw new InvalidOperationException("Unable to retrieve the root folder."); 

Agregue su aviso de copyright a su aplicación según su license.txt

El código en \Ookii.Dialogs.Wpf.Sample\MainWindow.xaml.cs línea 160-169 es un ejemplo que puede usar, pero deberá eliminarlo de MessageBox.Show(this, para WPF).

Funciona en mi máquina [TM]

Sugeriría, para agregar en el paquete de nugget:

  Install-Package OpenDialog 

Entonces la forma de usarlo es:

  Gat.Controls.OpenDialogView openDialog = new Gat.Controls.OpenDialogView(); Gat.Controls.OpenDialogViewModel vm = (Gat.Controls.OpenDialogViewModel)openDialog.DataContext; vm.IsDirectoryChooser = true; vm.Show(); WPFLabel.Text = vm.SelectedFilePath.ToString(); 

Aquí está la documentación: http://opendialog.codeplex.com/documentation

Funciona para archivos, archivos con filtro, carpetas, etc.

Sé que esta es una pregunta antigua, pero una forma simple de hacerlo es usar la opción FileDialog proporcionada por WPF y usar System.IO.Path.GetDirectory (filename).

Ninguna de estas respuestas funcionó para mí (en general, faltaba una referencia o algo así)

Pero esto simplemente hizo:

Usando FolderBrowserDialog en la aplicación WPF

Agregue una referencia a System.Windows.Forms y use este código:

  var dialog = new System.Windows.Forms.FolderBrowserDialog(); System.Windows.Forms.DialogResult result = dialog.ShowDialog(); 

No es necesario rastrear los paquetes faltantes. O agrega enormes clases

Esto me da un selector de carpetas moderno que también te permite crear una nueva carpeta

Aún no veo el impacto cuando se implementa en otras máquinas

Podría usar smth así en WPF. Creé un método de ejemplo. Ver abajo

 public string getFolderPath() { // Create OpenFileDialog Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Multiselect = false; openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); if (openFileDialog.ShowDialog() == true) { System.IO.FileInfo fInfo = new System.IO.FileInfo(openFileDialog.FileName); return fInfo.DirectoryName; } return null; } 

Para aquellos que no quieren crear un cuadro de diálogo personalizado, pero aún prefieren una forma 100% WPF y no quieren usar DDL separados, dependencias adicionales o API obsoletas, se me ocurrió un truco muy simple usando el cuadro de diálogo Guardar como.

No se necesita una directiva de uso, ¡simplemente copie y pegue el código a continuación!

Debería ser muy fácil de usar y la mayoría de las personas nunca lo notarán.

La idea surge del hecho de que podemos cambiar el título de ese diálogo, ocultar archivos y trabajar con el nombre del archivo resultante con bastante facilidad.

Es un gran truco seguro, pero tal vez hará el trabajo bien para su uso …

En este ejemplo, tengo un objeto de cuadro de texto para contener la ruta resultante, pero puede eliminar las líneas relacionadas y usar un valor de retorno si lo desea …

 // Create a "Save As" dialog for selecting a directory (HACK) var dialog = new Microsoft.Win32.SaveFileDialog(); dialog.InitialDirectory = textbox.Text; // Use current value for initial dir dialog.Title = "Select a Directory"; // instead of default "Save As" dialog.Filter = "Directory|*.this.directory"; // Prevents displaying files dialog.FileName = "select"; // Filename will then be "select.this.directory" if (dialog.ShowDialog() == true) { string path = dialog.FileName; // Remove fake filename from resulting path path = path.Replace("\\select.this.directory", ""); path = path.Replace(".this.directory", ""); // If user has changed the filename, create the new directory if (!System.IO.Directory.Exists(path)) { System.IO.Directory.CreateDirectory(path); } // Our final value is in path textbox.Text = path; } 

Los únicos problemas con este truco son:

  • El botón Confirmar aún dice “Guardar” en lugar de algo como “Seleccionar directorio”, pero en un caso como minas “Guardo” la selección del directorio para que funcione …
  • El campo de entrada todavía dice “Nombre de archivo” en lugar de “Nombre de directorio”, pero podemos decir que un directorio es un tipo de archivo …
  • Todavía hay un menú desplegable “Guardar como tipo”, pero su valor dice “Directorio (* .this.directory)”, y el usuario no puede cambiarlo por otra cosa, funciona para mí …

La mayoría de las personas no se darán cuenta de esto, aunque definitivamente preferiría usar una forma oficial de WPF si Microsoft les saca la cabeza fuera de sí, pero hasta que lo hagan, esa es mi solución temporal.