我正在编写一个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时只允许空文件名框 - 以任何方式来实现这个目标吗?
非常感谢。
答案 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;
}
这个黑客的唯一问题是:
大多数人都没有注意到这些,虽然我绝对更喜欢使用正式的WPF方式,如果微软会把他们的头从他们的屁股中解脱出来,但直到他们这样做,这才是我的临时解决方案。