WPF 有本机文件对话框吗?
在System.Windows.Controls
下,我可以看到一个PrintDialog
但是,我似乎找不到本机FileDialog
。我是否需要创建对 System.Windows.Forms 的引用还是有其他方法?
Under System.Windows.Controls
, I can see a PrintDialog
However, I can't seem to find a native FileDialog
. Do I need to create a reference to System.Windows.Forms
or is there another way?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
WPF 确实有内置(尽管不是本机)文件对话框。具体来说,它们位于稍微出乎意料的
Microsoft.Win32
命名空间中(尽管仍然是 WPF 的一部分)。请参阅OpenFileDialog
和特别是SaveFileDialog
类。但请注意,正如父命名空间所建议的那样,这些类只是 Win32 功能的包装器。然而,它确实意味着您不需要执行任何 WinForms 或 Win32 互操作,这使得它更好用。不幸的是,这些对话框的默认样式是“旧”Windows 主题,您需要在
app.manifest
中进行一些小修改才能强制它使用新主题。WPF does have built-in (although not native) file dialogs. Specifically, they are in the slightly unexpected
Microsoft.Win32
namespace (although still part of WPF). See theOpenFileDialog
andSaveFileDialog
classes in particular.Do however note that these classes are only wrappers around the Win32 functionality, as the parent namespace suggests. It does however mean that you don't need to do any WinForms or Win32 interop, which makes it somewhat nicer to use. Unfortunately, the dialogs are by default style in the "old" Windows theme, and you need a small hack in
app.manifest
to force it to use the new one.您可以创建一个简单的附加属性来将此功能添加到文本框。 打开文件对话框可以这样使用:
OpenFileDialogEx的代码:
You can create a simple attached property to add this functionality to a TextBox. Open file dialog can be used like this:
The code for OpenFileDialogEx:
我使用了 Gregor S. 提出的解决方案,它运行良好,尽管我必须将其转换为 VB.NET 解决方案,如果它对任何人有帮助,这里是我的转换...
I used the solution presented by Gregor S. and it works well, although I had to convert it to a VB.NET solution, here is my conversion if it helps anyone...
感谢 Gregor S 提供了一个巧妙的解决方案。
然而,在 Visual Studio 2010 中,它似乎使设计器崩溃 - 因此我调整了 OpenFileDialogEx 类中的代码。 XAML 代码保持不变:
Thanks to Gregor S for a neat solution.
In Visual Studio 2010 it seems to crash the designer however - so I've tweaked the code in the OpenFileDialogEx class. The XAML code stays the same: