有没有办法修改 OpenFileDialog 的行为,以便它查看它打开的文件夹中的文件,然后根据它们的内容忽略某些文件?
一个例子是打开一个充满 Zip 文件的文件夹,但只显示包含某个文件的文件夹。
从文档中,有 HookProc 但我不确定如何使用它。
请注意,如果可能的话,我意识到这将是一个相对缓慢的操作。目前我并不关心性能。
谢谢!
有没有办法修改 OpenFileDialog 的行为,以便它查看它打开的文件夹中的文件,然后根据它们的内容忽略某些文件?
一个例子是打开一个充满 Zip 文件的文件夹,但只显示包含某个文件的文件夹。
从文档中,有 HookProc 但我不确定如何使用它。
请注意,如果可能的话,我意识到这将是一个相对缓慢的操作。目前我并不关心性能。
谢谢!
我不会忽视 OpenFileDialog 的复杂性。构建一个真正有效的产品并不容易。当您自己构建时,它不是“正常”对话框,因此它会使用户感到困惑。即使你做得很好也是如此,这很难。所以我建议你坚持扩展已经存在的东西,而不是写新的东西。
查看这篇文章以了解可能/可以调整以完全满足您的需求的 OFD 扩展。您在 C# 中编写了一个回调来响应路径选择。
相关:FolderBrowserDialogEx是 FolderBrowserDialog 上的一个类似扩展。尽管有名称,但您可以将其配置为搜索文件和文件夹。There's a callback that gets invoked when something (a folder, a file) is selected, and within that callback you can do what you need to do. 例如,查看文件夹内的文件并填充文件列表以仅显示这些文件。
您可能会考虑的另一个选项是来自 Ookii 的对话框库。这是 OpenFileDialog 的一个开源实现,它包括用于 Vista 中所有新对话框内容的 COM 包装器。使用该库,您可以在 C# 代码中弹出一个 Vista OpenFileDialog 并从IFileDialogEvents接口接收事件。一个这样的事件是 OnFolderChange()。在处理程序中,您可以调用 IFolder.GetFolder() 它将为您提供一个IShellItem,它为您提供用户正在更改的文件夹。下一步是逐项列出并可能过滤文件集,这是我将留给读者的练习......
不,您必须为此实现自己的功能。但老实说,OpenFileDialog 确实并没有做很多事情。老实说,是的,您可能会陷入其中,但是当真正的工作是检查文件的内容然后您可以编写自己的简单 OpenFileDialog 类那。
您可能会发现这个问题对列出 zip 文件的内容很有帮助:
(请注意,您可能会对其进行线程化以提高性能,只是不要跨越多个线程)
您可能可以使用 Windows API 代码包(源附带)。与 Winforms/WPF 中的版本相比,通用文件对话框功能提供了更多的文件对话框功能。