Dialogue Ouvrir un répertoire
je veux que l'utilisateur de sélectionner un répertoire où un fichier que je génère ensuite sera sauvé. Je sais que dans WPF je devrais utiliser le OpenFileDialog
de Win32, mais malheureusement la boîte de dialogue exige que le(S) fichier (s) soit sélectionné (s) - il reste ouvert si je clique simplement OK sans en choisir un. Je pourrais "Hacker" la fonctionnalité en laissant l'utilisateur choisir un fichier et puis rayer le chemin pour comprendre à quel répertoire il appartient, mais c'est peu intuitif au mieux. Quelqu'un a vu ce fait avant?
13 réponses
vous pouvez utiliser la classe intégrée FolderBrowserDialog pour cela. Peu importe que ce soit dans l'espace de noms System.Windows.Forms
.
using (var dialog = new System.Windows.Forms.FolderBrowserDialog())
{
System.Windows.Forms.DialogResult result = dialog.ShowDialog();
}
si vous voulez que la fenêtre soit modale sur une fenêtre WPF, voir la question comment utiliser un FolderBrowserDialog à partir d'une application WPF .
modifier: si vous voulez quelque chose un peu plus de fantaisie que la plaine, ugly Windows Forms FolderBrowserDialog, il y a des alternatives qui vous permettent d'utiliser la boîte de dialogue Vista à la place:
- les bibliothèques de Tiers, tels que Ookii les boîtes de dialogue (.NET 3.5)
-
le Windows API Code Pack-Shell :
using Microsoft.WindowsAPICodePack.Dialogs; ... var dialog = new CommonOpenFileDialog(); dialog.IsFolderPicker = true; CommonFileDialogResult result = dialog.ShowDialog();
notez que ce dialogue n'est pas disponible sur les systèmes d'exploitation plus anciens que Windows Vista, alors assurez-vous de vérifier
CommonFileDialog.IsPlatformSupported
d'abord.
j'ai créé un UserControl qui est utilisé comme ceci:
<UtilitiesWPF:FolderEntry Text="{Binding Path=LogFolder}" Description="Folder for log files"/>
la source xaml ressemble à ceci:
<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>
et le code-derrière
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();
}
}
}
}
je suis l'aide de Ookii les boîtes de dialogue pendant un certain temps et de travail agréable pour WPF.
Voici la page directe:
pour Dialogue de répertoire pour obtenir le chemin de répertoire, D'abord ajouter le système de référence.Windows.Les formes, puis Régler, puis mettez ce code dans un clic sur un bouton.
var dialog = new FolderBrowserDialog();
dialog.ShowDialog();
folderpathTB.Text = dialog.SelectedPath;
(folderpathTB est le nom de TextBox où je veux mettre le chemin du dossier, ou u peut l'assigner à une variable de chaîne de caractères trop i.e.)
string folder = dialog.SelectedPath;
et si vous voulez obtenir le nom du fichier / chemin, faites simplement cela sur le bouton
" FileDialog fileDialog = new OpenFileDialog();
fileDialog.ShowDialog();
folderpathTB.Text = fileDialog.FileName;
(folderpathTB est le nom de Zone de texte où je wana mettre le chemin d'accès au fichier, OU u peut l'affecter à une variable de chaîne trop)
Note: pour le dialogue de Chemise, le système.Windows.Forme.dll doit être ajouté au projet, sinon ça ne marcherait pas.
j'ai trouvé le code ci-dessous sur le lien ci-dessous... et cela a fonctionné dialogue Sélectionner un dossier 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 meilleure façon d'atteindre ce que vous voulez est de créer votre propre contrôle basé sur wpf , ou utiliser un qui a été fait par d'autres personnes
pourquoi ? parce qu'il y aura un impact de performance notable lors de l'utilisation de la boîte de dialogue winforms dans une application wpf (pour une raison quelconque)
je recommande ce projet
https://opendialog.codeplex.com/
ou Nuget:
PM> Install-Package OpenDialog
c'est très MVVM amical et il n'est pas wraping les winforms boîte de dialogue
du dossier Ookii se trouve à Nuget.
PM> Install-Package Ookii.Dialogs
et, exemple de code est comme ci-dessous.
var dialog = new Ookii.Dialogs.Wpf.VistaFolderBrowserDialog();
if (dialog.ShowDialog(this).GetValueOrDefault())
{
textBoxFolderPath.Text = dialog.SelectedPath;
}
La Ookii VistaFolderBrowserDialog
est celui que vous voulez.
si vous voulez seulement le navigateur de dossier de dialogue Ooki et rien d'autre alors télécharger la Source , cherry-choisir les fichiers dont vous avez besoin pour le navigateur de dossier (indice: 7 fichiers) et il construit fine dans .NET 4.5.2. J'ai dû ajouter une référence à System.Drawing
. Comparez les références du projet original avec les vôtres.
Comment comprendre les fichiers? Ouvrez votre application et Ookii dans différentes instances de Visual Studio. Ajoutez VistaFolderBrowserDialog.cs
à votre application et continuez à ajouter des fichiers jusqu'à ce que les erreurs de compilation disparaissent. Vous trouvez les dépendances dans le projet Ookii-Control-cliquez sur celle que vous voulez suivre à sa source (jeu de mots prévu).
Voici les fichiers dont vous avez besoin si vous êtes trop paresseux pour le faire ...
NativeMethods.cs
SafeHandles.cs
VistaFolderBrowserDialog.cs
\ Interop
COMGuids.cs
ErrorHelper.cs
ShellComInterfaces.cs
ShellWrapperDefinitions.cs
modifier la ligne 197 dans VistaFolderBrowserDialog.cs
sauf si vous voulez inclure leur Resources.Resx
throw new InvalidOperationException(Properties.Ressources.Folderbrowserdialogorootfolder);
throw new InvalidOperationException("Unable to retrieve the root folder.");
ajoutez leur notice de copyright à votre application selon leur license.txt
le code dans \Ookii.Dialogs.Wpf.Sample\MainWindow.xaml.cs
ligne 160-169 est un exemple que vous pouvez utiliser, mais vous devrez supprimer this,
de MessageBox.Show(this,
pour WPF.
Fonctionne sur Ma Machine [TM]
je suggère, pour ajouter dans le paquet nugget:
Install-Package OpenDialog
alors la façon de l'utiliser est:
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();
Voici la documentation: http://opendialog.codeplex.com/documentation
Fonctionne pour les Fichiers, les fichiers avec filtre, dossiers, etc
je sais que c'est une vieille question, mais une façon simple de le faire est d'utiliser L'option FileDialog fournie par WPF et en utilisant le système.IO.Chemin.GetDirectory (filename).
aucune de ces réponses ne fonctionnait pour moi (en général, il y avait une référence manquante ou quelque chose du genre)
mais cela tout simplement fait:
à l'Aide de FolderBrowserDialog en application WPF
ajouter une référence à System.Windows.Forms
et utiliser ce code:
var dialog = new System.Windows.Forms.FolderBrowserDialog();
System.Windows.Forms.DialogResult result = dialog.ShowDialog();
pas besoin de retrouver les paquets manquants. Ou ajouter des classes énormes
ce qui donne moi modernes d'un dossier sélecteur vous permet également de créer un nouveau dossier
je suis encore à voir l'impact lorsqu'il est déployé à d'autres machines
vous pouvez utiliser smth comme ceci dans WPF. J'ai créé l'exemple de la méthode. Découvrez ci-dessous.
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;
}
pour ceux qui ne veulent pas créer une boîte de dialogue personnalisée, mais préfèrent quand même une méthode 100% WPF et ne veulent pas utiliser des DDLs séparés, des dépendances supplémentaires ou des API périmées, j'ai créé un hack très simple en utilisant la boîte de dialogue Enregistrer sous.
Non utiliser la directive nécessaire, vous pouvez simplement copier-coller le code ci-dessous !
il devrait toujours être très convivial et la plupart des gens ne le remarqueront jamais.
L'idée vient du fait que nous peut changer le titre de cette boîte de dialogue, cacher des fichiers, et travailler autour du nom de fichier résultant assez facilement.
c'est un gros hack pour sûr, mais peut-être qu'il fera le travail juste très bien pour votre usage...
dans cet exemple, j'ai un objet textbox pour contenir le chemin résultant, mais vous pouvez supprimer les lignes associées et utiliser une valeur de retour si vous le souhaitez...
// 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;
}
Le seul problème avec ce hack sont :
- bouton D'accusé de réception dit toujours "enregistrer" au lieu de quelque chose comme "Select directory", mais dans un cas comme les mines je "enregistrer" la sélection de répertoire de sorte qu'il fonctionne toujours...
- champ D'entrée indique toujours "nom de fichier" au lieu de "nom de répertoire", mais nous pouvons dire qu'un répertoire est un type de fichier...
- il y a encore une liste déroulante" Save as type", mais sa valeur indique " Directory (*.ce.répertoire)", et l'utilisateur ne peut pas le changer pour autre chose, fonctionne m'...
la plupart des gens ne les remarqueront pas, bien que je préférerais certainement utiliser une voie officielle WPF si microsoft sortirait leur tête de leurs culs, mais jusqu'à ce qu'ils le fassent, c'est ma solution temporaire.