C# 对目录使用OpenFileDialog,而不是FolderBrowserDialog

C# 对目录使用OpenFileDialog,而不是FolderBrowserDialog,c#,wpf,windows,winforms,C#,Wpf,Windows,Winforms,我想在应用程序中使用文件夹浏览器,但我不想使用FolderBrowser对话框。(有几个原因,例如使用起来很痛苦) 我想使用标准的OpenFileDialog,但对目录进行了修改 例如,它有一个很好的实现(Preferences/Directories/Put new downloads in:)。标准的“打开文件”对话框使用户能够: 在底部的文本字段中粘贴完整路径 使用Vista上的“收藏夹链接”栏 在Vista上使用搜索 自动记住最后一个目录 更多 有人知道如何实现这一点吗?在C#。中,

我想在应用程序中使用文件夹浏览器,但我不想使用FolderBrowser对话框。(有几个原因,例如使用起来很痛苦)

我想使用标准的OpenFileDialog,但对目录进行了修改

例如,它有一个很好的实现(Preferences/Directories/Put new downloads in:)。标准的“打开文件”对话框使用户能够:

  • 在底部的文本字段中粘贴完整路径
  • 使用Vista上的“收藏夹链接”栏
  • 在Vista上使用搜索
  • 自动记住最后一个目录
  • 更多

有人知道如何实现这一点吗?在C#。

中,我不确定是否使用了AutoCurrent,但这听起来很像新Vista的FOS#u PICKFOLDERS选项集。它的通用C#代码类似于:

var frm = (IFileDialog)(new FileOpenDialogRCW());
uint options;
frm.GetOptions(out options);
options |= FOS_PICKFOLDERS;
frm.SetOptions(options);

if (frm.Show(owner.Handle) == S_OK) {
    IShellItem shellItem;
    frm.GetResult(out shellItem);
    IntPtr pszString;
    shellItem.GetDisplayName(SIGDN_FILESYSPATH, out pszString);
    this.Folder = Marshal.PtrToStringAuto(pszString);
}
可以找到完整的代码。

有关有效的解决方案,请参见

我相信有三件事可以使这个解决方案比所有其他解决方案更好

  • 使用简单。 它只需要在项目中包含两个文件(无论如何都可以合并为一个文件)
  • 在XP或旧系统上使用时,它会回到标准
  • 作者授予将代码用于您认为合适的任何目的的权限。 没有许可证,你可以随意使用代码

  • 下载代码。

    似乎是这个问题的重复:-
    var dlg = new Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog();
    dlg.IsFolderPicker = true;