【问题标题】:How can I make CommonOpenFileDialog select folders only, but still show files?如何使 CommonOpenFileDialog 仅选择文件夹,但仍显示文件?
【发布时间】:2011-12-29 20:06:04
【问题描述】:

我正在使用 Microsoft 的 CommonOpenFileDialog 来允许用户选择一个文件夹,但是当对话框出现时没有文件可见。 IsFolderPicker设置为true时,是否可以显示文件和文件夹?

我当前的代码如下所示

var dialog = new CommonOpenFileDialog();
dialog.IsFolderPicker = true;

if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
{
    SelectedFolderPath = dialog.FileName;
}

【问题讨论】:

  • 如果用户只能选择文件夹,为什么要显示文件?这不是一个选择。考虑将 InitialDirectory 设置为至少包含一些子目录的文件夹,以使列表不为空。
  • @HansPassant 用户正在选择包含要处理的文件的文件夹,显示文件是用户验证他们选择了正确文件夹的一种方式。
  • @Rachel -- 是的,我发现了这个问题,因为这正是我的需要:通过使用文件夹作为上下文来选择文件夹,也就是说,我知道我有正确的文件夹。

标签: c# openfiledialog windows-api-code-pack


【解决方案1】:

没想到,我就是这样做的

  var dialog = new CommonOpenFileDialog
  {
    EnsurePathExists = true,
    EnsureFileExists = false,
    AllowNonFileSystemItems = false,
    DefaultFileName = "Select Folder",
    Title = "Select The Folder To Process"
  };


  dialog.SetOpenButtonText("Select Folder");

  if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
  dirToProcess = Directory.Exists(dialog.FileName) ? dialog.FileName : Path.GetDirectoryName(dialog.FileName);

编辑:神圣的 2 年前蝙蝠侠!


似乎做了一些改变,下面的 sn-p 似乎可以完成这项工作

var openFolder = new CommonOpenFileDialog();
openFolder.AllowNonFileSystemItems = true;
openFolder.Multiselect = true;
openFolder.IsFolderPicker = true;
openFolder.Title = "Select folders with jpg files";

if (openFolder.ShowDialog() != CommonFileDialogResult.Ok)
{
    MessageBox.Show("No Folder selected");
    return;
}

// get all the directories in selected dirctory
var dirs = openFolder.FileNames.ToArray();

【讨论】:

  • -1 第一个解决方案不允许用户选择文件夹,只能选择文件。第二种解决方案没有按照 OP 的要求显示文件夹中的文件。 Windows 10,也许这改变了?
  • 请注意,在 Windows 10 上未设置 DefaultFileName(在第一个 sn-p 中完成)会使 ShowDialog() 抛出。
  • 这在 Windows 10 中也不起作用,你测试了吗?
  • @S.Serpooshan 我在 2013 年写了这篇文章,比 Windows 10 发布早了 2 年,所以不,它没有针对 Windows 10 进行测试。请随时提供更新的解决方案。几年没做 Windows 开发了。
【解决方案2】:

如果您希望用户只选择一个文件夹,您是否考虑过使用 FolderBrowserDialog?

【讨论】:

  • 我讨厌FolderBrowserDialog,因为它糟糕的用户界面和缺乏用户友好性。例如,如果您知道路径名,则无法键入它,并且它不会像 FileDialog 那样记住您最后选择的项目
  • 最后,这就是我所做的。我宁愿创建我自己的自定义OpenFolderDialog,它对用户更友好,但这不是一个非常重要的项目,我没有时间投入到这样的事情上。我确实使 FilePath TextBox 可编辑,因此用户可以在其中复制/粘贴文件夹路径(也许是我对FolderBrowserDialog 最大的不满)
【解决方案3】:

不太确定是否可以以标准方式进行,但即使考虑到可以,请考虑 UI。在一个地方看到当代文件夹和文件,但能够选择 only 文件夹,在我看来并不是一个好的 UI。恕我直言,更好、更“自然”的方式是让一个控件填充文件夹,而另一个控件(显然是只读的)只填充必须加载的文件。

希望这会有所帮助。

【讨论】:

  • 我不喜欢这个想法,因为没有太多的 UI 空间可用于显示文件列表,并且用户希望在 OpenFileDialog 的文件夹中看到文件。当他们选择文件夹时向他们显示一个空白列表通常会导致用户认为他们位于错误的位置,或者他们的文件发生了问题。
  • 顺便说一句,不要向他们展示文件,不要让他们选择任何文件,这有点令人沮丧。如何在外部启用文件夹表单的拖放(比如说 Windows 资源管理器)并在 UI 上以某种方式对其进行概念化?
猜你喜欢
  • 2021-04-19
  • 2019-12-30
  • 2012-12-30
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
相关资源
最近更新 更多