如何使用OpenFileDialog选择文件或路径

时间:2015-04-27 11:12:28

标签: c# wpf file directory openfiledialog

我正在编写一个WPF / C#应用程序,并希望用户能够选择一个(或多个)文件,或一个(或多个)文件夹,而无需选择最初使用的选项,但有意。在我看来,实现这一目标的最佳方法是拥有一个标准的FolderBrowserDialog,只要用户没有选择文件,但浏览到一个路径,单击打开按钮就应该选择该路径。

实际上,这个解决方案不起作用,因为OpenFileDialog不允许空选择,你可以点击"打开",但什么都不会发生。此处描述了一个解决方法,允许输入假名称,例如" Selected Folder。"作为文件名。之后可以过滤掉,这是一种解决方法,但不是一个好的方法: http://www.codeproject.com/Articles/44914/Select-file-or-folder-from-the-same-dialog

此解决方案有两个重要缺点: 1.)你必须过滤假名 2.)如果手动粘贴文件名,或先选择文件,然后将选择切换到文件夹,则不会自动插入假名。

当然我知道有一些像FolderBrowserDialog,即使我只想选择文件夹而不是文件,我也会省略它。原因是:这个对话框没有可能从剪贴板粘贴路径,我发现一路导航很烦人,我宁愿从某处复制路径并粘贴它们,这在OpenFileDialog中完全正常,但在FolderBrowserDialog中却不行。此外,FolderBrowserDialog不允许选择文件和文件夹。

我搜索了很多内容,但找不到令人满意的解决方案,但我相信很多人肯定会遇到这个问题。

如前所述,对我来说最优雅的方式是让OpenFileDialog在点击Open时只允许空文件名框 - 以任何方式来实现这个目标吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

让用户使用相同的对话框选择目录或文件是不实际的,也不是直觉上可行的。 但是,如果您想要一个用于选择文件夹的解决方案,那么它是:

如果您不想创建自定义对话框,但仍然喜欢100%WPF方式,并且不想使用单独的DDL,其他依赖项或过时的API,我想出了一个非常简单的黑客攻击使用WPF的“另存为”对话框来实际选择目录。

不需要使用指令,您只需复制粘贴下面的代码即可!

它应该仍然非常人性化,大多数人都不会注意到。

这个想法来自于我们可以更改对话框的标题,隐藏文件以及轻松解决生成的文件名这一事实。

这肯定是一个很大的黑客,但也许它可以很好地满足您的使用......

在这个示例中,我有一个文本框对象来包含生成的路径,但如果您愿意,可以删除相关的行并使用返回值...

// Create a "Save As" dialog for selecting a directory (HACK)
var dialog = new Microsoft.Win32.SaveFileDialog();
dialog.InitialDirectory = textbox.Text; // Use current value for initial dir
dialog.Title = "Select a Directory"; // instead of default "Save As"
dialog.Filter = "Directory|*.this.directory"; // Prevents displaying files
dialog.FileName = "select"; // Filename will then be "select.this.directory"
if (dialog.ShowDialog() == true) {
    string path = dialog.FileName;
    // Remove fake filename from resulting path
    path = path.Replace("\\select.this.directory", "");
    path = path.Replace(".this.directory", "");
    // If user has changed the filename, create the new directory
    if (!System.IO.Directory.Exists(path)) {
        System.IO.Directory.CreateDirectory(path);
    }
    // Our final value is in path
    textbox.Text = path;
}

这个黑客的唯一问题是:

  • 确认按钮仍然显示"保存"取而代之的是"选择目录",但是在类似地雷的情况下我会"保存"目录选择,所以它仍然有效......
  • 输入字段仍然显示"文件名"而不是"目录名称",但我们可以说目录是一种文件......
  • 还有一个"保存类型"下拉菜单,但其价值表示"目录(* .this.directory)",用户无法更改其他内容,对我有用...

大多数人都没有注意到这些,虽然我绝对更喜欢使用正式的WPF方式,如果微软会把他们的头从他们的屁股中解脱出来,但直到他们这样做,这才是我的临时解决方案。