В VS .NET, когда вы выбираете папку для проекта, отображается диалоговое окно, которое выглядит как OpenFileDialog или SaveFileDialog, но настроено на прием только папок. С тех пор как я увидел это, я хотел знать, как это делается. Я знаю о FolderBrowserDialog, но мне никогда не нравился этот диалог. Он начинается слишком мало и не позволяет мне воспользоваться возможностью набрать путь.
Я почти уверен, что сейчас нет способа сделать это из .NET, но мне так же любопытно, как вы делаете это из неуправляемого кода. Если не считать полного переопределения диалога с нуля, как вы модифицируете диалог, чтобы иметь такое поведение?
Я также хотел бы повторить, что я знаю о FolderBrowserDialog, но иногда мне не нравится его использовать, в дополнение к искреннему любопытству, как настроить диалог таким образом. Указание мне просто использовать FolderBrowserDialog помогает мне поддерживать постоянный интерфейс, но не удовлетворяет мое любопытство, поэтому оно не считается ответом.
Это не специфичная для Vista вещь; Я видел этот диалог начиная с VS .NET 2003, поэтому его можно использовать в Win2k и WinXP. Это не вопрос «я хочу знать, как правильно это сделать», а вопрос «мне было любопытно, так как я впервые хотел сделать это в VS 2003». Я понимаю, что в файловом диалоге Vista есть возможность сделать это, но он работает в XP, поэтому я знаю, что они что- то сделали, чтобы заставить его работать. Специфичные для Vista ответы не являются ответами, потому что Vista не существует в контексте вопроса.
Обновление: Я принимая ответ Скотта Вишневски, потому что она поставляется с рабочим образцом, но я думаю , что Серж заслуживает похвалы за указывая на диалоговые настройки (который, по общему признанию противный из .NET , но это делает работу) и Марк Рэнс для выяснить , что MS наверное накатил собственный диалог для этой задачи.
источник
dialog.FileName = "Folder Selection"
должен бытьdialog.FileName = "Folder Selection."
с завершающим периодом? во всяком случае, я не могу заставить его работать в powershell по второму щелчку «Открыть» в любом случае. Он продолжает говорить, что файл не найден, хотя CheckFileExists предположительно является ложнымdialog.CheckFileExists = 0
вместо false решил мою проблемуОтветы:
У меня есть диалог, который я написал, называется диалог OpenFileOrFolder, который позволяет вам открыть папку или файл.
Если вы установите для его значения AcceptFiles значение false, то он будет работать только в режиме принятия папки.
Вы можете скачать исходники с GitHub здесь
источник
Вы можете использовать FolderBrowserDialogEx - повторно используемую производную от встроенного FolderBrowserDialog. Этот позволяет вам ввести путь, даже путь UNC. Вы также можете просматривать компьютеры или принтеры с ним. Работает так же, как встроенный FBD, но ... лучше.
(РЕДАКТИРОВАТЬ: я должен был указать, что этот диалог может быть установлен для выбора файлов или папок.)
Полный исходный код (один короткий модуль C #). Свободно. MS-Public License.
Код для его использования:
источник
Существует пакет кода Windows API. У него много вещей, связанных с оболочкой, включая
CommonOpenFileDialog
класс (вMicrosoft.WindowsAPICodePack.Dialogs
пространстве имен). Это идеальное решение - обычный открытый диалог с отображением только папок.Вот пример того, как его использовать:
К сожалению, Microsoft больше не поставляет этот пакет, но несколько человек неофициально загрузили двоичные файлы в NuGet. Один пример можно найти здесь . Этот пакет - просто материал для оболочки. Если вам это нужно, у того же пользователя есть несколько других пакетов, которые предлагают больше функциональности, присутствующих в оригинальном пакете.
источник
Пакет Ookii.Dialogs содержит управляемую оболочку вокруг нового диалогового окна браузера папок (в стиле Vista). Это также изящно ухудшается на старых операционных системах.
источник
OpenFileDialog
диалог с папкой -style.Для этого лучше использовать FolderBrowserDialog.
источник
После нескольких часов поисков я нашел этот ответ на leetNightShade в виде рабочего раствора .
Я верю, что есть три вещи, которые делают это решение намного лучше, чем все остальные.
Загрузите код здесь .
источник
Точное Audio Copy работает таким образом на Windows XP. Отображается стандартный диалог открытия файла, но поле имени файла содержит текст «Имя файла будет игнорироваться».
Просто угадайте здесь, но я подозреваю, что строка вводится в элемент управления редактирования поля со списком каждый раз, когда в диалог вносятся существенные изменения. Пока поле не пустое, а флажки диалогового окна не проверяют наличие файла, диалоговое окно можно закрыть в обычном режиме.
Изменить: это намного проще, чем я думал. Вот код на C ++ / MFC, вы можете перевести его в среду по вашему выбору.
Редактировать 2: Это должен быть перевод на C #, но я не бегло говорю на C #, поэтому не стреляйте в меня, если он не работает.
Изменить 3: Наконец, посмотрел на фактическое диалоговое окно в Visual Studio 2005 (у меня не было доступа к нему ранее). Это не стандартный диалог открытия файла! Если вы проверите окна в Spy ++ и сравните их со стандартным открытым файлом, вы увидите, что структура и имена классов не совпадают. Если вы внимательно посмотрите, вы также можете заметить некоторые различия между содержимым диалогов. Мой вывод заключается в том, что Microsoft полностью заменила стандартный диалог в Visual Studio, чтобы дать ему такую возможность. Мое решение или что-то подобное будет как можно ближе, если только вы не захотите написать свое собственное с нуля.
источник
Хорошо, позвольте мне попытаться соединить первую точку ;-) Немного поигравшись с Spy ++ или Winspector, вы увидите, что текстовое поле Папка в расположении проекта VS является настройкой стандартного диалога. Это не то же самое поле, что и текстовое поле имени файла в стандартном диалоговом окне, например в блокноте.
Оттуда, я полагаю, VS скрывает текстовые поля / комбинированные списки имен файлов и типов файлов и использует собственный шаблон диалога, чтобы добавить свою собственную часть внизу диалога.
РЕДАКТИРОВАТЬ: Вот пример такой настройки и как это сделать (в Win32. Не .NET):
m_ofn - это структура OPENFILENAME, которая лежит в основе диалогового окна файла. Добавьте эти 2 строки:
где IDD_FILEDIALOG_IMPORTXLIFF - это пользовательский шаблон диалога, который будет добавлен внизу диалога. Смотрите часть в красном ниже. (источник: apptranslator.com )
В этом случае настраиваемая часть - это только метка + гиперссылка, но это может быть любой диалог. Он может содержать кнопку ОК, которая позволит нам проверить выбор папки.
Но как мы избавимся от некоторых элементов управления в стандартной части диалога, я не знаю.
Более подробно в этой статье MSDN .
источник
Вы можете создать подкласс файлового диалога и получить доступ ко всем его элементам управления. У каждого есть идентификатор, который можно использовать для получения дескриптора окна. Затем вы можете показать и скрыть их, получать от них сообщения об изменениях выбора и т. Д. И т. Д. Все зависит от того, сколько усилий вы хотите предпринять.
Мы сделали это, используя поддержку классов WTL, и настроили диалог файлов, включив в него панель пользовательских мест и подключаемые представления COM.
MSDN предоставляет информацию о том, как сделать это с помощью Win32, эта статья CodeProject содержит пример , а эта статья CodeProject предоставляет пример .NET .
источник
Вы можете использовать такой код
Для расширенного скрытия текстового поля для имени файла вам нужно взглянуть на OpenFileDialogEx
Код:
источник
Я полагаю, что вы на Vista используете VS2008? В этом случае я думаю, что опция FOS_PICKFOLDERS используется при вызове диалогового окна файла Vista IFileDialog . Я боюсь, что в .NET-коде это потребовало бы большого количества грубого P / Invoke-кода взаимодействия, чтобы начать работать.
источник
Первое решение
Я разработал это как очищенную версию диалога выбора папки в стиле .NET Win 7 Биллом Седдоном из lyquidity.com (у меня нет никакой принадлежности). (Я узнал о его коде из другого ответа на этой странице ). Я написал свой собственный, потому что его решение требует дополнительного класса Reflection, который не нужен для этой целевой цели, использует управление потоком на основе исключений, не кэширует результаты своих вызовов отражений. Обратите внимание, что вложенный статический
VistaDialog
класс таков, что его статические переменные отражения не пытаются заполняться, еслиShow
метод никогда не вызывается. Он возвращается к диалоговому окну до Vista, если не в достаточно высокой версии Windows. Должно работать в Windows 7, 8, 9, 10 и выше (теоретически).Он используется примерно так в форме Windows:
Конечно, вы можете поиграть с его параметрами и тем, какие свойства он предоставляет. Например, он разрешает множественный выбор в диалоге в стиле Vista.
Второе решение
Саймон Мурье дал ответ, который показывает, как выполнить ту же самую работу, используя взаимодействие с API-интерфейсом Windows напрямую, хотя его версию пришлось бы дополнить, чтобы использовать диалоговое окно более старого стиля, если в более старой версии Windows. К сожалению, я еще не нашел его пост, когда работал над решением. Назови свой яд!
источник
Попробуйте это из Codeproject (кредит Nitron ):
Я думаю, что это тот же диалог, о котором вы говорите - может быть, это поможет, если вы добавите скриншот?
источник
В Vista вы можете использовать IFileDialog с установленным параметром FOS_PICKFOLDERS. Это приведет к отображению OpenFileDialog-подобного окна, где вы можете выбрать папки:
Для старых Windows вы всегда можете прибегнуть к хитрости с выбором любого файла в папке.
Рабочий пример, который работает на .NET Framework 2.0 и более поздних версиях, можно найти здесь .
источник
Вы можете использовать такой код
Фильтр является пустой строкой. Имя файла AnyName, но не пустое
источник
Библиотека Ookii Dialogs for WPF имеет класс, который обеспечивает реализацию диалогового окна браузера папок для WPF.
Также есть версия, которая работает с Windows Forms .
источник
Я знаю, что вопрос был о конфигурации,
OpenFileDialog
но, увидев, что Google привел меня сюда, я также могу указать, что, если вы ищете ТОЛЬКО папки, вы должны использоватьFolderBrowserDialog
Вместо, как ответ на другой вопрос SO нижеКак указать путь, используя диалог открытия файла в vb.net?
источник