3

FolderBrowserDialog.RootFolder 属性仅限于Environment.SpecialFolder枚举器中定义的特殊文件夹。但是在我的应用程序中,我们需要显示此对话框,但根路径需要可配置,并且通常是自定义文件夹,与枚举器中的任何特殊文件夹无关。

如何显示分配给自定义文件夹的根目录的文件夹浏览器?也许 RootFolder 属性不可能,但是否可以通过其他方式产生相同的效果(即用户无法在根文件夹之外查看或选择)。在这个答案中,有人暗示可能使用反射操作,但没有更新。知道这在.NET中是否可行吗?

4

1 回答 1

2

我根据ParkerJay86的这个解决方案编写了这个解决方案。该解决方案适用于 Windows 8,并测试了多个路径。考虑您指定的 rootFolder 应该以DriveLetter:\C:\ProgramData”开头

    private void browseFolder_Click(object sender, EventArgs e)
    {
        String selectedPath;
        if (ShowFBD(@"C:\", "Please Select a folder", out selectedPath))
        {
            MessageBox.Show(selectedPath);
        }
    }

public bool ShowFBD(String rootFolder, String title, out String selectedPath)
{
    var shellType = Type.GetTypeFromProgID("Shell.Application");
    var shell = Activator.CreateInstance(shellType);
    var result = shellType.InvokeMember("BrowseForFolder", BindingFlags.InvokeMethod, null, shell, new object[] { 0, title, 0, rootFolder });
    if (result == null)
    {
        selectedPath = "";
        return false;
    }
    else
    {
        StringBuilder sb = new StringBuilder();
        while (result != null)
        {
            var folderName = result.GetType().InvokeMember("Title", BindingFlags.GetProperty, null, result, null).ToString();
            sb.Insert(0, String.Format(@"{0}\", folderName));
            result = result.GetType().InvokeMember("ParentFolder", BindingFlags.GetProperty, null, result, null);
        }
        selectedPath = sb.ToString();

        selectedPath = Regex.Replace(selectedPath, @"Desktop\\Computer\\.*\(\w:\)\\", rootFolder.Substring(0, 3));
        return true;
    }
}
于 2012-10-18T08:34:57.757 回答