it-swarm.com.ru

Как использовать OpenFileDialog для выбора папки?

Как использовать OpenFileDialog для выбора папок?

Я собирался использовать следующий проект: https://github.com/scottwis/OpenFileOrFolderDialog

Однако я столкнулся с одной проблемой. Он использует функцию GetOpenFileName и структуру OPENFILENAME. И OPENFILENAME имеет члена с именем templateID. Это идентификатор для шаблона диалога. И проект содержит файл res1.rc и шаблонный диалог init. Но я не мог понять, как прикрепить этот файл к моему проекту на C #.

Есть ли лучший способ использовать OpenFileDialog для выбора папок?

207
Yun

В основном вам нужен класс FolderBrowserDialog:

Предлагает пользователю выбрать папку. Этот класс не может быть унаследован.

Пример:

using(var fbd = new FolderBrowserDialog())
{
    DialogResult result = fbd.ShowDialog();

    if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
    {
        string[] files = Directory.GetFiles(fbd.SelectedPath);

        System.Windows.Forms.MessageBox.Show("Files found: " + files.Length.ToString(), "Message");
    }
}

Если вы работаете в WPF, вы должны добавить ссылку на System.Windows.Forms.

вы также должны добавить using System.IO для класса Directory

331
Ionică Bizău

В качестве заметки для будущих пользователей, которые хотели бы избегать использования FolderBrowserDialog, Microsoft использовала выпуск API под названием WindowsAPICodePack, в котором был полезный диалог под названием CommonOpenFileDialog, который можно было установить в режим IsFolderPicker.

Если у вас есть доступ к пакетам nuget, он по-прежнему доступен в открытых списках как WindowsAPICodePack

Для строки включения:

using Microsoft.WindowsAPICodePack.Dialogs;

Использование:

CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;
if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
{
    MessageBox.Show("You selected: " + dialog.FileName);
}

ВНИМАНИЕ: официальный пакет Microsoft Nuget доступен уже сейчас

  • Microsoft.WindowsAPICodePack-Core
  • Microsoft.WindowsAPICodePack-Shell

каждый пакет от Microsoft и будет устанавливать оба.
URL проекта: http://code.msdn.Microsoft.com/WindowsAPICodePack .

Пользователь NuGet aybe загрузил серию неофициальных пакетов. Большинство людей, кажется, доверяют ему как надежному источнику.

Это все, что мне нужно было установить, чтобы использовать CommonOpenFileDialog. (nuget обработал зависимости)

Install-Package WindowsAPICodePack-Shell
146
Joe

Странно, что столько ответов/голосов, но никто не добавляет следующий код в качестве ответа:

using (var fldrDlg = new FolderBrowserDialog())
{ 
    //fldrDlg.Filter = "Png Files (*.png)|*.png";
    //fldrDlg.Filter = "Excel Files (*.xls, *.xlsx)|*.xls;*.xlsx|CSV Files (*.csv)|*.csv"

    if (fldrDlg.ShowDialog() == DialogResult.OK)
    {
        //fldrDlg.SelectedPath -- your result
    }
}
21
Andrew

Существует хакерское решение, использующее OpenFileDialog, где ValidateNames и CheckFileExists оба установлены в false, а FileName задает фиктивное значение, чтобы указать, что каталог выбран. 

Я говорю хак, потому что это сбивает с толку пользователей о том, как выбрать папку. Они должны быть в нужной папке, а затем просто нажать кнопку «Открыть», а имя файла говорит «Выбор папки». 

 C# Folder selection dialog

Это основано на Выбрать файл или папку из того же диалогового окна Дениса Станковского.

OpenFileDialog folderBrowser = new OpenFileDialog();
// Set validate names and check file exists to false otherwise windows will
// not let you select "Folder Selection."
folderBrowser.ValidateNames = false;
folderBrowser.CheckFileExists = false;
folderBrowser.CheckPathExists = true;
// Always default to Folder Selection.
folderBrowser.FileName = "Folder Selection.";
if (folderBrowser.ShowDialog() == DialogResult.OK)
{
    string folderPath = Path.GetDirectoryName(folderBrowser.FileName);
    // ...
}
15
Daniel Ballinger

Звучит так, будто вы только после FolderBrowserDialog .

14
Simon Whitehead

Вот еще одно решение, в котором весь источник доступен в одном простом Zip-файле.

Он представляет OpenFileDialog с дополнительными флагами Windows, что делает его похожим на диалог выбора папок Windows 7+. 

Что касается веб-сайта, то это общественное достояние: «Нет такой лицензии, которую вы можете взять и делать с кодом по своему усмотрению».

Ссылки на Archive.org:

1
Ben Keene

Взгляните на библиотеки Ookii Dialogs, в которых реализован диалог браузера папок для Windows Forms и WPF соответственно.

 enter image description here

Ookii.Dialogs.WinForms

https://github.com/caioproiete/ookii-dialogs-winforms


Ookii.Dialogs.Wpf

https://github.com/caioproiete/ookii-dialogs-wpf

0
Caio Proiete