Диалог открытия каталога - PullRequest
250 голосов
/ 17 декабря 2009

Я хочу, чтобы пользователь выбрал каталог, в который будет сохранен файл, который я сгенерирую. Я знаю, что в WPF я должен использовать OpenFileDialog из Win32, но, к сожалению, диалог требует выбора файла (ов) - он остается открытым, если я просто нажму OK, не выбрав один. Я мог бы «взломать» функциональность, позволив пользователю выбрать файл, а затем лишить путь, чтобы выяснить, к какому каталогу он принадлежит, но в лучшем случае это не интуитивно понятно. Кто-нибудь видел это сделано раньше?

Ответы [ 13 ]

2 голосов
/ 27 апреля 2016

Ookii VistaFolderBrowserDialog - это то, что вам нужно.

Если вам нужен только браузер папок из Диалоги Ooki и ничего больше, то скачайте источник , выберите файлы, которые вам нужны для браузера папок (подсказка: 7 файлов) и он прекрасно работает в .NET 4.5.2. Мне пришлось добавить ссылку на System.Drawing. Сравните ссылки в оригинальном проекте с вашими.

Как вы узнаете, какие файлы? Откройте свое приложение и Ookii в разных экземплярах Visual Studio. Добавьте VistaFolderBrowserDialog.cs в свое приложение и продолжайте добавлять файлы, пока ошибки сборки не исчезнут. Вы найдете зависимости в проекте Ookii - удерживая нажатой клавишу «Control», щелкните на том, за которым вы хотите вернуться к его источнику (каламбур).

Вот файлы, которые вам нужны, если вам лень это делать ...

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

Редактировать строку 197 в VistaFolderBrowserDialog.cs, если вы не хотите включить их Resources.Resx

выбросить новое исключение InvalidOperationException (Properties.Resources.FolderBrowserDialogNoRootFolder);

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

Добавьте уведомление об авторских правах в ваше приложение согласно их license.txt

Код в строке \Ookii.Dialogs.Wpf.Sample\MainWindow.xaml.cs 160-169 - это пример, который вы можете использовать, но вам потребуется удалить this, из MessageBox.Show(this, для WPF.

Работает на моей машине [ТМ]

1 голос
/ 18 июня 2017

Ни один из этих ответов не работал для меня (как правило, отсутствовала ссылка или что-то в этом роде)

Но это довольно просто:

Использование FolderBrowserDialog в приложении WPF

Добавьте ссылку на System.Windows.Forms и используйте этот код:

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

Нет необходимости отслеживать пропущенные пакеты. Или добавить огромные классы

Это дает мне современный селектор папок, который также позволяет вам создавать новую папку

Мне еще предстоит увидеть влияние при развертывании на других машинах

0 голосов
/ 13 апреля 2018

Вы можете использовать что-то подобное в WPF. Я создал пример метода. Проверьте ниже.

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;           
       }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...