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

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

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

Например, µTorrent имеет прекрасную реализацию (Настройки / Каталоги / Поместить новые загрузки :). Стандартный диалог открытия файла позволяет пользователю:

  • вставьте полные пути в текстовое поле внизу
  • использовать панель «Избранные ссылки» в Vista
  • использовать поиск в Vista
  • автоматически запоминать последний каталог
  • более...

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

Ответов (3)

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

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);
}

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

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

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

  1. Прост в использовании. Для этого нужно всего лишь включить в проект два файла (которые в любом случае можно объединить в один).
  2. Он возвращается к стандартному FolderBrowserDialog при использовании в XP или более старых системах.
  3. Автор дает разрешение использовать код для любых целей, которые вы сочтете нужными.

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

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

WindowsAPICodePack

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