Для тех, кто не хочет создавать настраиваемое диалоговое окно, но все же предпочитает 100% WPF-способ и не хочет использовать отдельные DDL, дополнительные зависимости или устаревшие API, я предложил очень простой взлом с помощью Save Как диалог.
Использование директивы не требуется, вы можете просто скопировать и вставить приведенный ниже код!
Это все еще должно быть очень удобно, и большинство людей никогда не заметят.
Идея исходит из того факта, что мы можем легко изменить заголовок этого диалога, скрыть файлы и обойти полученное имя файла.
Это большой взлом, но, возможно, он отлично подойдет для вашего использования ...
В этом примере у меня есть объект текстового поля, в котором содержится результирующий путь, но вы можете удалить связанные строки и использовать возвращаемое значение, если хотите ...
// 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;
}
Единственные проблемы с этим хаком:
- Кнопка подтверждения по-прежнему говорит «Сохранить» вместо чего-то вроде «Выбрать каталог», но в случае, например мины, я «Сохранить» выбор каталога, чтобы он все еще работал ...
- Поле ввода по-прежнему говорит «Имя файла» вместо «Имя каталога», но мы можем сказать, что каталог - это тип файла ...
- Все еще есть выпадающий список "Сохранить как тип", но его значение говорит "Directory (* .this.directory)", и пользователь не может изменить его на что-то другое, у меня работает ...
Большинство людей этого не заметят, хотя я бы определенно предпочел использовать официальный способ WPF, если бы Майкрософт вытащил свои головы из задниц, но пока они этого не сделают, это мое временное исправление.