奇怪的 FolderBrowserDialog 行为

9
我正在支持一个运行在.NET 3.5上的旧版本C#应用程序。我们发现在Windows Vista上(32位或64位)使用FolderBrowserDialog时存在问题。
基本上,对话框会出现,但只显示根目录结点,甚至无法展开以显示其他内容。显然,这是无法使用的。
经过大量的尝试和错误,我最终设定了RootFolder属性,在其余设置之前,才能获得可用性。
FolderBrowserDialog browsePath = new FolderBrowserDialog();
browsePath.RootFolder = Environment.SpecialFolder.MyComputer;
browsePath.SelectedPath = this.textBoxTo.Text;
browsePath.Description = TextResources.OutputTargetCaption;
browsePath.ShowNewFolderButton = true;

if(browsePath.ShowDialog(this) == DialogResult.OK)
{
    this.textBoxTo.Text = UpdateLocation(browsePath.SelectedPath);
}

这个问题“几乎”解决了,但是我遇到了一个奇怪的问题:当所选路径(即 textBoxTo 的内容)位于当前用户主目录中时,它不会自动浏览到该路径,而只会展开计算机节点一级。对于任何其他路径都没有问题。
我确定你的第一反应会是权限问题,这也是我的直觉。但似乎不是这个问题,无论是以管理员身份还是其它账户运行程序都会出现这个问题。当然,这是干净的安装,没有奇怪的权限或其他问题。
当所有默认设置都在当前用户目录下时,这非常令人烦恼!
注意:这只发生在应用程序内部;据我所见,在小型测试应用程序中无法重现此问题。
有什么想法是什么原因导致这个问题?
更新:截图:
这是我想要的行为(从小型测试应用程序获得的)
这是使用默认属性得到的
这是将根设置为计算机得到的 注意:最后一张图片所设置的 SelectedPath 与预期的图片相同...

我已经尝试了您的代码,使用.NET 4和3.5,没有发现任何问题。如果您不提供“RootFolder”,它将浏览任何...桌面文件夹本身是不可扩展的。很高兴能从您的应用程序中看到一些屏幕截图。 - Dumbo
这就是问题所在,你无法使用默认的RootFolder进行浏览。当然,我将获取一些预期和当前的行为。 - Alexander R
不,Intellisense 显示为 System.Windows.Forms.FolderBrowserDialog - Alexander R
你的代码中是否有任何wndproc覆盖?你的应用程序是否处理任何WM_*消息?是否有可能缩小程序的某些部分以隔离问题? - default
实际上,我相信我们确实在某些地方有相当多的覆盖和消息处理。不幸的是,缩减它并不容易,这是一个庞大(约1百万行代码)紧密耦合的应用程序... 我在这些方法中应该查看什么特别的内容吗? - Alexander R
显示剩余4条评论
3个回答

1

我曾经遇到过类似的问题。在Windows Vista和Windows 7中,以下代码:

browsePath.RootFolder = Environment.SpecialFolder.MyComputer;

返回桌面。如果您在Windows资源管理器中查看,树的根是桌面,而不是像在Windows XP中一样是“我的电脑”。 要解决此问题,请改用以下方法:

browsePath.RootFolder = @"C:\";

每个 Windows 计算机都有一个 C:\ 驱动器,因此这将解决您的问题。
希望这能帮到您。

0
如果您只是访问用户的私人文件夹,请使用
browsePath.RootFolder = Environment.SpecialFolder.Personal

只有指定的文件夹及其子文件夹才会出现在对话框中并可供选择。当对话框显示时,SelectedPath 属性与 RootFolder 一起决定选定的文件夹是什么,只要 SelectedPath 是 RootFolder 的子文件夹(或更准确地说,指向由 RootFolder 表示的 shell 命名空间的子文件夹)的绝对路径即可。
简而言之,除非 RootFolder 已经在当前用户的私人文件夹内,否则不能将某个人的私人文件夹作为启动选定路径输入。
详情请参见:http://msdn.microsoft.com/en-us/library/system.windows.forms.folderbrowserdialog.rootfolder.aspx

我非常确定 C:\Users\Blah我的电脑 文件夹下面,你可能把第二部分搞反了:只能输入在 RootFolder 下面的 selectedPath,而不能反过来... 也不可能仅限于用户目录,他们还需要导出到网络和可移动驱动器。 - Alexander R
抱歉,我的意思是“RootFolder设置为当前用户的私人文件夹”。 - jornare
然而,如果你一开始省略设置RootFolder,它就能正常工作。 :) - jornare
是的,那可能有效,但我们需要能够选择网络驱动器,所以这不是一个选项。此外,省略RootFolder会默认为桌面文件夹,正如我之前提到的根本行不通! - Alexander R
抱歉,整个应用程序都被标记为STA了...不过还是谢谢你! - Alexander R

0

VB.NET 代码

Dim fdb As New FolderBrowserDialog
    With fdb
        '.RootFolder = Environment.SpecialFolder.MyComputer
        'this folder don't exists in vista, the my computer folder was renamed to computer (in spanish "mi pc" to "equipo")
        'try with another initial folder
        .RootFolder = Environment.SpecialFolder.Desktop
        'You can set the desktop as home directory because users typically already have shortcuts or the left side menu to navigate
        Dim dr As DialogResult = .ShowDialog
        If _
            dr = DialogResult.OK Or _
            dr = DialogResult.Yes Then _
            If IO.Directory.Exists(.SelectedPath) = True Then _
            Me.textBoxTo.Text = UpdateLocation(.SelectedPath)
    End With

基本上,尝试另一个目录并确保所选目录存在。 如果仍然有问题,可能是系统中的某些故障。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接