将 CommonFileDialog 自定义为文件夹和文件选取器

本文关键字:文件 选取 文件夹 CommonFileDialog 自定义 | 更新日期: 2023-09-27 17:56:45

我正在尝试用 C# 制作一个"文件和文件夹"对话框。(只是一个警告:我会对所有FolderBrowserDialog建议投反对票。这种对话是自然的可憎之物)

目前,我正在使用WindowsApiCodePack中找到的CommonOpenFileDialog,它具有属性IsFolderPicker,这使对话框仅成为文件夹选择器。但是我的用户需要能够选择文件或文件夹。

所以我正在寻找一个对话框,让我同时选择文件和文件夹。手段无关紧要。C#,WPF,WindowsApiCodePack,Ookii对话框,C++,P/Invoke,Com+,Win32,VB等...

只需要一个控件,它允许我选择一个文件或文件夹,我可以从 C# 调用它,并且具有默认的 Windows OpenFileDialog 外观。这可能吗,如何?

将 CommonFileDialog 自定义为文件夹和文件选取器

几年前我自定义了FolderBrowser对话框。我让它显示输入字段,用户可以在其中指定路径而无需浏览它。我认为可以自定义以显示文件和文件夹。

这就是我进行自定义的方式:

我使用.NET Reflector来反汇编FolderBrowserDialog的代码。我将反汇编的代码保存为 MyFolderBrowserDialog .

在反射的代码中,我发现FolderBrowserDialog调用非托管 windows 函数SHBrowseForFolder该函数接受BROWSEINFO结构作为参数。BROWSEINFO 结构具有 ulFlags 成员,该成员是一个标志值,可以对其进行位屏蔽以包含要使用的功能。

MyFolderBrowserDialog位屏蔽BIF_EDITBOX (0x00000010)ulFlags中以获取输入字段。

根据文档,如果您将位掩码BIF_BROWSEINCLUDEFILES (0x00004000) ulFlags它应该包括文件和文件夹,从而解决您的问题。

我实际上还没有尝试让它显示文件,但我认为它可能值得一试。

希望这有帮助!