打开目录对话框
我希望用户选择一个目录,用于保存我将生成的文件。我知道在 WPF 中我应该使用 Win32 中的 OpenFileDialog
,但不幸的是,该对话框需要选择文件 - 如果我只是单击“确定”而不选择文件,它就会保持打开状态。我可以通过让用户选择一个文件然后剥离路径来找出它属于哪个目录来“破解”该功能,但这充其量是不直观的。以前有人见过这样做吗?
I want the user to select a directory where a file that I will then generate will be saved. I know that in WPF I should use the OpenFileDialog
from Win32, but unfortunately the dialog requires file(s) to be selected - it stays open if I simply click OK without choosing one. I could "hack up" the functionality by letting the user pick a file and then strip the path to figure out which directory it belongs to but that's unintuitive at best. Has anyone seen this done before?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(19)
2023 年更新:最后,通过 .NET 8,WPF 获得了原生、现代的
OpenFolderDialog
:这是否意味着 Microsoft 最终投入资源向 WPF 添加缺失的功能?当然不是! Microsoft 员工正忙于帮助您构建云原生基于 AI 的<在此插入更多流行语>Teams 聊天机器人。像修复 WPF 来解决现实、无聊的业务需求这样的平凡任务留给了社区志愿者,例如 Jan,谁将此文件夹浏览器对话框添加到 .NET。
.NET Framwork 4.8 的旧答案:
您可以使用内置的 FolderBrowserDialog 类。不要介意它位于 System.Windows.Forms 命名空间中。
如果您希望窗口在某些 WPF 窗口上为模态窗口,请参阅问题如何从 WPF 应用程序使用FolderBrowserDialog。
编辑:如果您想要比简单、丑陋的Windows窗体FolderBrowserDialog更奇特的东西,有一些替代方案可以让您使用Vista对话框:
第三方库,例如Ookii 对话框 (.NET 4.5+)
Windows API 代码包外壳:
请注意,此对话框在早于 Windows Vista 的操作系统上不可用,因此请务必先检查
CommonFileDialog.IsPlatformSupported
。UPDATE 2023: Finally, with .NET 8, WPF gets a native, modern
OpenFolderDialog
:Does this mean that Microsoft finally invests resources in adding missing functionality to WPF? Of course not! Microsoft employees are busy enabling you to build cloud-native AI-based <insert more buzzwords here> Teams chat bots. Mundane tasks like fixing WPF to solve real-live, boring business needs are left to community volunteers like Jan, who added this folder browser dialog to .NET.
Old answer for .NET Framwork 4.8:
You can use the built-in FolderBrowserDialog class for this. Don't mind that it's in the
System.Windows.Forms
namespace.If you want the window to be modal over some WPF window, see the question How to use a FolderBrowserDialog from a WPF application.
EDIT: If you want something a bit more fancy than the plain, ugly Windows Forms FolderBrowserDialog, there are some alternatives that allow you to use the Vista dialog instead:
Third-party libraries, such as Ookii dialogs (.NET 4.5+)
The Windows API Code Pack-Shell:
Note that this dialog is not available on operating systems older than Windows Vista, so be sure to check
CommonFileDialog.IsPlatformSupported
first.我创建了一个 UserControl,其使用方式如下:
xaml 源代码如下所示:
和代码隐藏
I created a UserControl which is used like this:
The xaml source looks like this:
and the code-behind
正如前面的答案中所述,
FolderBrowserDialog
是用于此目的的类。有些人对此对话框的外观和行为有(合理的)担忧。好消息是它已“现代化” “在 NET Core 3.0 中,对于那些编写针对该版本或更高版本的 Windows 窗体或 WPF 应用程序的人来说,现在是一个可行的选择(如果仍然使用 NET Framework,那么你就不走运了)。至在 NET Core WPF 应用中引用
System.Windows.Forms
,需要编辑项目文件并添加以下行:这可以直接放在现有
< 之后;UseWPF>
元素。那么这只是使用对话框的情况:
FolderBrowserDialog
有一个RootFolder
属性,据说“设置浏览开始的根文件夹”但是无论我将其设置为什么,都没有任何区别;SelectedPath
似乎是用于此目的的更好的属性,但是尾部反斜杠是必需的。此外,ShowNewFolderButton 属性似乎也被忽略,无论如何,该按钮始终显示。
As stated in earlier answers,
FolderBrowserDialog
is the class to use for this. Some people have (justifiable) concerns with the appearance and behaviour of this dialog. The good news is that it was "modernized" in NET Core 3.0, so is now a viable option for those writing either Windows Forms or WPF apps targeting that version or later (you're out of luck if still using NET Framework though).To reference
System.Windows.Forms
in a NET Core WPF app, it is necessary to edit the project file and add the following line:This can be placed directly after the existing
<UseWPF>
element.Then it's just a case of using the dialog:
FolderBrowserDialog
has aRootFolder
property that supposedly "sets the root folder where the browsing starts from" but whatever I set this to it didn't make any difference;SelectedPath
seemed to be the better property to use for this purpose, however the trailing backslash is required.Also, the
ShowNewFolderButton
property seems to be ignored as well, the button is always shown regardless.Ookii 文件夹对话框可以在 Nuget 中找到。
PM> Install-Package Ookii.Dialogs.Wpf
并且,示例代码如下。
有关如何使用它的更多信息:https://github.com/augustoproiete/ookii-dialogs-wpf
Ookii folder dialog can be found at Nuget.
PM> Install-Package Ookii.Dialogs.Wpf
And, example code is as below.
More information on how to use it: https://github.com/augustoproiete/ookii-dialogs-wpf
对于那些不想创建自定义对话框但仍然喜欢 100% WPF 方式并且不想使用单独的 DDL、附加依赖项或过时的 API 的人,我想出了一个使用“另存为”对话框的非常简单的技巧。
不需要使用指令,您只需复制粘贴下面的代码即可!
它应该仍然非常用户友好,大多数人永远不会注意到。
这个想法来自于这样一个事实:我们可以很容易地更改该对话框的标题、隐藏文件并解决生成的文件名。
这肯定是一个很大的黑客,但也许它会很好地满足您的使用...
在这个示例中,我有一个文本框对象来包含结果路径,但您可以删除相关行并使用返回值,如果你希望...
这个黑客的唯一问题是:
大多数人不会注意到这些,尽管如果微软愿意的话,我肯定更喜欢使用官方的 WPF 方式,但在他们这样做之前,这就是我的临时解决办法。
For those who don't want to create a custom dialog but still prefer a 100% WPF way and don't want to use separate DDLs, additional dependencies or outdated APIs, I came up with a very simple hack using the Save As dialog.
No using directive needed, you may simply copy-paste the code below !
It should still be very user-friendly and most people will never notice.
The idea comes from the fact that we can change the title of that dialog, hide files, and work around the resulting filename quite easily.
It is a big hack for sure, but maybe it will do the job just fine for your usage...
In this example I have a textbox object to contain the resulting path, but you may remove the related lines and use a return value if you wish...
The only issues with this hack are :
Most people won't notice these, although I would definitely prefer using an official WPF way if microsoft would get their heads out of their asses, but until they do, that's my temporary fix.
Ookii 对话框 包含一个用于选择文件夹(而不是文件)的对话框:
https://github.com/ookii-dialogs
Ookii Dialogs includes a dialog for selecting a folder (instead of a file):
https://github.com/ookii-dialogs
对于要获取目录路径的目录对话框,首先添加引用 System.Windows.Forms,然后解析,然后将此代码放在单击按钮中。
(folderpathTB 是我想要放置文件夹路径的 TextBox 的名称,或者您也可以将其分配给字符串变量,即)
如果您想要获取文件名/路径,只需在按钮单击上执行此操作
(folderpathTB 是我想要的 TextBox 的名称)输入文件路径,或者也可以将其分配给字符串变量)
注意:对于文件夹对话框,必须将System.Windows.Forms.dll添加到项目中,否则将无法工作。
For Directory Dialog to get the Directory Path, First Add reference System.Windows.Forms, and then Resolve, and then put this code in a button click.
(folderpathTB is name of TextBox where I wana put the folder path, OR u can assign it to a string variable too i.e.)
And if you wana get FileName/path, Simply do this on Button Click
(folderpathTB is name of TextBox where I wana put the file path, OR u can assign it to a string variable too)
Note: For Folder Dialog, the System.Windows.Forms.dll must be added to the project, otherwise it wouldn't work.
我在下面的链接中找到了下面的代码...并且它有效
选择文件夹对话框 WPF
I found the below code on below link... and it worked
Select folder dialog WPF
我建议,在nugget包中添加:
然后使用它的方法是:
这是文档:
http://opendialog.codeplex.com/documentation
适用于文件、带过滤器的文件、文件夹等
I'd suggest, to add in the nugget package:
Then the way to used it is:
Here's the documentation:
http://opendialog.codeplex.com/documentation
Works for Files, files with filter, folders, etc
实现您想要的效果的最佳方法是创建您自己的基于 wpf 的控件,或使用其他人制作的控件
为什么 ?因为在 wpf 应用程序中使用 winforms 对话框时会对性能产生明显的影响(出于某种原因)
我推荐这个项目
https://opendialog.codeplex.com/
或 Nuget :
它对 MVVM 非常友好,并且不会包装 winforms 对话框
The best way to achieve what you want is to create your own wpf based control , or use a one that was made by other people
why ? because there will be a noticeable performance impact when using the winforms dialog in a wpf application (for some reason)
i recommend this project
https://opendialog.codeplex.com/
or Nuget :
it's very MVVM friendly and it isn't wraping the winforms dialog
Ookii
VistaFolderBrowserDialog
就是您想要的。如果您只需要 Ooki 对话框 中的文件夹浏览器,而不需要其他内容,则 下载源代码,挑选文件夹浏览器所需的文件(提示:7 个文件)并它在 .NET 4.5.2 中构建良好。我必须添加对 System.Drawing 的引用。将原始项目中的参考文献与您的参考文献进行比较。
你如何找出哪些文件?在不同的 Visual Studio 实例中打开您的应用程序和 Ookii。将
VistaFolderBrowserDialog.cs
添加到您的应用中并继续添加文件,直到构建错误消失。您可以在 Ookii 项目中找到依赖项 - 按住 Control 键并单击要跟踪其源的依赖项(双关语)。如果您懒得这样做,这里是您需要的文件...
编辑
VistaFolderBrowserDialog.cs
中的第 197 行,除非您想包含其Resources.Resx
throw new InvalidOperationException(Properties.Resources.FolderBrowserDialogNoRootFolder);根据其
license.txt
中的代码将其版权声明添加到您的应用程序
\Ookii.Dialogs.Wpf.Sample 中\MainWindow.xaml.cs
第 160-169 行是一个可以使用的示例,但您需要从MessageBox.Show(this,
中删除this,
WPF适用于我的机器 [TM] 。
The Ookii
VistaFolderBrowserDialog
is the one you want.If you only want the Folder Browser from Ooki Dialogs and nothing else then download the Source, cherry-pick the files you need for the Folder browser (hint: 7 files) and it builds fine in .NET 4.5.2. I had to add a reference to
System.Drawing
. Compare the references in the original project to yours.How do you figure out which files? Open your app and Ookii in different Visual Studio instances. Add
VistaFolderBrowserDialog.cs
to your app and keep adding files until the build errors go away. You find the dependencies in the Ookii project - Control-Click the one you want to follow back to its source (pun intended).Here are the files you need if you're too lazy to do that ...
Edit line 197 in
VistaFolderBrowserDialog.cs
unless you want to include theirResources.Resx
throw new InvalidOperationException(Properties.Resources.FolderBrowserDialogNoRootFolder);Add their copyright notice to your app as per their
license.txt
The code in
\Ookii.Dialogs.Wpf.Sample\MainWindow.xaml.cs
line 160-169 is an example you can use but you will need to removethis,
fromMessageBox.Show(this,
for WPF.Works on My Machine [TM]
这些答案都不适合我(通常缺少参考或类似的东西)
但这很简单:
在WPF应用程序中使用FolderBrowserDialog
添加对
System.Windows.Forms
的引用并使用此代码:无需追踪丢失的包。或者添加大量的类
这给了我一个现代的文件夹选择器,它还允许您创建一个新文件夹
我还没有看到部署到其他机器时的影响
None of these answers worked for me (generally there was a missing reference or something along those lines)
But this quite simply did:
Using FolderBrowserDialog in WPF application
Add a reference to
System.Windows.Forms
and use this code:No need to track down missing packages. Or add enormous classes
This gives me a modern folder selector that also allows you to create a new folder
I'm yet to see the impact when deployed to other machines
我知道这是一个老问题,但一个简单的方法是使用 WPF 提供的 FileDialog 选项并使用 System.IO.Path.GetDirectory(filename)。
I know this is an old question, but a simple way to do this is use the FileDialog option provided by WPF and using System.IO.Path.GetDirectory(filename).
Microsoft.Win32 .NET 库似乎不支持选择文件夹(仅支持文件),因此您在 WPF 中运气不好(截至 7/2022)。我觉得现在最好的选择是 Ookii for WPF: https://github.com/ookii -dialogs/ookii-dialogs-wpf。它在 WPF 中运行良好并且符合预期,但没有 Microsoft 支持。您可以将其作为 NuGet 包获取。 XAML 视图背后的代码:
It seems that the Microsoft.Win32 .NET library does not support selecting folders (only files), so you are out of luck in WPF (as of 7/2022). I feel the best option now is Ookii for WPF: https://github.com/ookii-dialogs/ookii-dialogs-wpf. It works great and as expected in WPF minus Microsoft support. You can get it as a NuGet package. Code behind XAML View:
Microsoft.Win32.OpenFolderDialog
是 .NET 8.0-preview7 的一部分,并将在 .NET 8 中提供:功能请求
已批准的 API 提案
拉取请求
发布 .NET v8.0.0-preview.7.23375.1
Microsoft.Win32.OpenFolderDialog
is part of .NET 8.0-preview7 and will be available in .NET 8:Feature request
Approved API proposal
Pull request
Release .NET v8.0.0-preview.7.23375.1
你可以在 WPF 中使用这样的东西。我创建了示例方法。
检查下面。
You could use smth like this in WPF. I've created example method.
Check below.
最新的 .NET 8 有特殊的 OpenFolderDialog - 您可以使用它!
Latest .NET 8 got special OpenFolderDialog - you can use it!
这是一个简单得多的答案。 WPF 使用 Microsoft.Win32 中的 OpenFolderDialag
This is much simpler answer. WPF is using OpenFolderDialag from Microsoft.Win32