wpf - elementos - open folder dialog c#
Abrir el diálogo del directorio (13)
Quiero que el usuario seleccione un directorio donde se guardará un archivo que luego generaré. Sé que en WPF debo usar OpenFileDialog
de Win32, pero desafortunadamente el cuadro de diálogo requiere que se seleccionen los archivos; permanece abierto si simplemente hago clic en Aceptar sin elegir uno. Podría "piratear" la funcionalidad dejando que el usuario elija un archivo y luego elimine la ruta para averiguar a qué directorio pertenece, pero eso no es intuitivo en el mejor de los casos. ¿Alguien ha visto esto hecho antes?
El Ookii VistaFolderBrowserDialog
es el que desea.
Si solo desea el Explorador de carpetas de Ooki Dialogs y nada más, descargue la Fuente , seleccione los archivos que necesita para el Explorador de carpetas (sugerencia: 7 archivos) y se creará correctamente en .NET 4.5.2. Tuve que agregar una referencia a System.Drawing
. Compara las referencias del proyecto original con las tuyas.
¿Cómo averiguas qué archivos? Abre tu aplicación y Ookii en diferentes instancias de Visual Studio. Agregue VistaFolderBrowserDialog.cs
a su aplicación y siga agregando archivos hasta que desaparezcan los errores de compilación. Encontrará las dependencias en el proyecto de Ookii: pulse Control y haga clic en la que desea seguir para volver a su origen (intencionalmente).
Aquí están los archivos que necesitas si eres demasiado perezoso 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 la nueva excepción 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á quitarlo de MessageBox.Show(this,
para WPF.
Funciona en mi máquina [TM]
Creé un UserControl que se usa así:
<UtilitiesWPF:FolderEntry Text="{Binding Path=LogFolder}" Description="Folder for log files"/>
La fuente xaml se ve así:
<UserControl x:Class="Utilities.WPF.FolderEntry"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DockPanel>
<Button Margin="0" Padding="0" DockPanel.Dock="Right" Width="Auto" Click="BrowseFolder">...</Button>
<TextBox Height="Auto" HorizontalAlignment="Stretch" DockPanel.Dock="Right"
Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
</DockPanel>
</UserControl>
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();
}
}
}
}
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;
}
Encontré el siguiente código en el siguiente enlace ... y funcionó Seleccionar el cuadro de diálogo de la carpeta 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
}
Estoy usando los diálogos de Ookii por un tiempo y funciona bien para WPF.
Aquí está la página directa:
La mejor manera de lograr lo que desea es crear su propio control basado en wpf, o usar uno que fue creado por otras personas
por qué ? porque habrá un notable impacto en el rendimiento al utilizar el cuadro de diálogo winforms en una aplicación wpf (por alguna razón)
recomiendo este proyecto
https://opendialog.codeplex.com/
o Nuget:
PM> Install-Package OpenDialog
es muy compatible con MVVM y no está envolviendo el cuadro de diálogo de winforms
Ninguna de estas respuestas funcionó para mí (generalmente 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 hay necesidad de rastrear paquetes faltantes. O agregar clases enormes
Esto me da un selector de carpeta moderno que también te permite crear una nueva carpeta
Todavía estoy por ver el impacto cuando se implementa en otras máquinas
Para aquellos que no desean 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 con el cuadro de diálogo Guardar como.
No es necesaria una directiva de uso, simplemente puede copiar y pegar el código a continuación.
Todavía debe ser muy fácil de usar y la mayoría de la gente nunca lo notará.
La idea surge del hecho de que podemos cambiar el título de ese diálogo, ocultar archivos y solucionar el nombre de archivo resultante con bastante facilidad.
Seguro que es un gran truco, pero quizás haga el trabajo bien para su uso ...
En este ejemplo, tengo un objeto de cuadro de texto que contiene 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 hack son:
- El botón de reconocimiento aún dice "Guardar" en lugar de algo como "Seleccionar directorio", pero en un caso como las minas "Guardé" la selección de directorio para que aún funcione ...
- El campo de entrada aún 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 la gente no se dará cuenta de esto, aunque definitivamente preferiría usar una forma oficial de WPF si Microsoft sacara sus cabezas de sus culos, pero hasta que lo hagan, esa es mi solución temporal.
Para que el cuadro de diálogo del directorio obtenga la ruta del directorio, primero agregue la referencia System.Windows.Forms y luego resuelva, y luego coloque este código en un botón.
var dialog = new FolderBrowserDialog();
dialog.ShowDialog();
folderpathTB.Text = dialog.SelectedPath;
(folderpathTB es el nombre de TextBox donde puse la ruta de la carpeta, O puede asignarlo a una variable de cadena también, es decir)
string folder = dialog.SelectedPath;
Y si desea obtener FileName / ruta, simplemente haga esto en el botón Haga clic
FileDialog fileDialog = new OpenFileDialog();
fileDialog.ShowDialog();
folderpathTB.Text = fileDialog.FileName;
(folderpathTB es el nombre de TextBox donde puse la ruta del archivo, O también puede asignarlo a una variable de cadena)
Nota: para Folder Dialog, System.Windows.Forms.dll debe agregarse al proyecto, de lo contrario no funcionaría.
Podrías usar algo así en WPF. He creado el método de ejemplo. Compruebe a continuación.
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;
}
Puede usar la clase 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 en alguna ventana de WPF, consulte la pregunta Cómo usar un FolderBrowserDialog desde una aplicación de WPF .
EDITAR: Si desea algo un poco más elegante que el simple, feo Windows Forms FolderBrowserDialog, hay algunas alternativas que le permiten usar el cuadro de diálogo de Vista en su lugar:
- Bibliotecas de terceros, como los diálogos de Ookii (.NET 3.5)
El paquete de código de API de Windows-Shell :
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
.
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 (nombre de archivo).
Yo sugeriría, para agregar en el paquete de nugget:
Install-Package OpenDialog
Entonces la forma de utilizarlo 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.