1

OpenFileDialog有一个单曲Filter也是DefaultExt。我想知道为什么当对话框打开时,我还会列出所有 Internet 快捷方式(例如,可以获取文件夹的快捷方式,但不能获取 *.URL 文件)。

是否有一些我可以打开的魔法开关,以便将它们包含在显示给用户的列表中?

目前,我必须通过设置来FileOk处理事件处理程序中的条件,如果我检测到用户选择了一个文件(它也不是 100% 的时间工作,一些快捷方式似乎仍在通过过滤器)。不过,首先不让它们进入列表会更好。e.Canceltrue*.URLFileOk

4

2 回答 2

2

您是正确的,Windows 的“打开文件”常用对话框显示 Internet 快捷方式以及文件夹。我不知道为什么会存在这种行为,但它就在那里——它发生在 Win32(尝试记事本验证)以及 WinForms 应用程序中。

有一种方法可以解决这个问题,但警告:这很hacky!如果您从 FileDialog 类派生自定义文件对话框类,则可以访问一些受保护的事件,您可以使用这些事件来自定义 FileDialog 操作的各个方面。

Dino Esposito 在 2003 年 11 月写了一篇 MSDN 杂志文章,展示了这种技术的工作原理。这篇文章不再在 MSDN 站点上,但您可以在此处的 Wayback 机器的存档中获取它:http://web.archive.org/web/20150117123625/http: //msdn.microsoft.com/en-us/magazine /cc300434.aspx

您可能需要做的是挂钩或子类化文件对话框的 WndProc,手动查看文件列表控件,识别作为快捷方式的条目,并将 Windows 消息发送到文件列表控件以删除这些项目。然后您需要注意该列表的刷新(例如从目录更改)并重复过滤操作。

这将是一个巨大的黑客攻击,但这是可能的。

如果这是太多的工作或太多的hackiness,我建议只使用 FileOk 事件来防止用户通过Cancel=true从 FileOk 事件的 CancelEventHandler 返回来选择快捷方式。

于 2009-12-12T20:00:39.383 回答
2

恼人的。您可以通过为 FileOk 事件实现一个处理程序来打击它们,这样用户就永远无法选择一个:

private void openFileDialog1_FileOk(object sender, CancelEventArgs e) {
  string ext = System.IO.Path.GetExtension(openFileDialog1.FileName);
  if (String.Compare(ext, ".url", true) == 0) e.Cancel = true;
}
于 2009-12-12T19:39:49.257 回答