Используя OpenFileDialog для каталога, а не FolderBrowserDialog

Я хочу иметь браузер папки в своем приложении, но Я не хочу использовать FolderBrowserDialog. (По нескольким причинам, например, больно использовать)

Я хочу использовать стандартный OpenFileDialog, но изменен для каталогов.

В качестве примера μTorrent имеет приятную реализацию (Предпочтения/Каталоги/Положите новые загрузки в:). Стандартный диалог Open File Dialog позволяет пользователю:

  • вставить полные пути в текстовое поле внизу
  • используйте панель "Избранные ссылки" в Vista.
  • использовать поиск в Vista​​li >
  • авто запомнить последний каталог
  • подробнее...

Кто-нибудь знает, как это реализовать? В С#.

Ответы

Ответ 1

Я не уверен в uTorrent, но это звучит как новая Vista IFileDialog с установленной опцией FOS_PICKFOLDERS. Общий код С# для него будет выглядеть примерно так:

var frm = (IFileDialog)(new FileOpenDialogRCW());
uint options;
frm.GetOptions(out options);
options |= FOS_PICKFOLDERS;
frm.SetOptions(options);

if (frm.Show(owner.Handle) == S_OK) {
    IShellItem shellItem;
    frm.GetResult(out shellItem);
    IntPtr pszString;
    shellItem.GetDisplayName(SIGDN_FILESYSPATH, out pszString);
    this.Folder = Marshal.PtrToStringAuto(pszString);
}

Полный код можно найти здесь.

Ответ 2

См. этот ответ leetNightShade для рабочего решения.

Есть три вещи, которые, я считаю, делают это решение намного лучше, чем все остальные.

  • Прост в использовании. Это требует, чтобы вы включили в свой проект два файла (которые могут быть объединены в один момент).
  • Возвращается к стандартным FolderBrowserDialog при использовании на XP или более старых систем.
  • Автор предоставляет разрешение на использование кода для любых целей, которые вы сочтете подходящими.

    Нет лицензии, так как вы свободны принимать и делать с кодом, что хотите.

Загрузите код здесь.

Ответ 3

WindowsAPICodePack

var dlg = new Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog();
dlg.IsFolderPicker = true;