禁用部分 SaveFileDialog

Posted

技术标签:

【中文标题】禁用部分 SaveFileDialog【英文标题】:Disabling parts of the SaveFileDialog 【发布时间】:2009-08-14 09:21:21 【问题描述】:

我正在构建一个需要使用SaveFileDialog 的应用程序。问题是我想限制用户使用SaveFileDialog 的某些部分(例如,我不希望他们编辑文件名)。我听说使用 Windows 表单 SaveAsDialog 很难做到这一点。您知道如何在本机代码中执行此操作吗?你有一个完整的无法理解的例子(我需要整个例子,因为我从未使用过 Windows API)?

PS。我真的需要使用SaveFileDialog 来保持 UI 一致。

【问题讨论】:

请问您为什么要这样做?我不清楚您为什么要提供 SaveFileDialog 并且不允许用户指定文件名,因为您立即破坏了您希望维护的 UI 一致性。 【参考方案1】:

如果文件名是固定的并且用户只能导航到另一个位置,只需使用FolderBrowserDialog 代替。恕我直言,这也是一致的。

【讨论】:

我真的不明白你在哪里回答了如何禁用部分对话框的问题。如果您想否认问题的前提,请发表评论,而不是答案。 由于问题也是关于UI一致性的,我不认为我否认了问题的前提。从我的角度来看,一致性是使用适当的工具来完成任务,而不是其他需要弯曲以适应的东西。 @incredible_Honk,肯尼迪先生似乎有一个股票评论,他喜欢在不提供答案的情况下粘贴。 Honk, FolderBrowserDialog 如果 Bluetiger 要求限制人们在保存对话框中更改文件名的方法确实是一个很好的建议,但这不是他或她所要求的。问题是关于如何修改保存对话框的行为,其中一个示例是限制文件名。您解决了具体示例,但没有解决一般问题。 Lazarus,这不是股票评论,只是我觉得适用于这里的两个答案,所以我复制并粘贴了它一次。两个数据点不会形成趋势。由于我要说的不是问题的答案,所以我发布了 cmets。这就是 cmets 用于的原因。仅仅因为我没有自己的答案并不意味着我不能说其他人的答案质量低下。【参考方案2】:

如果你真的想使用通用的保存文件对话框,但想让文件名只读,你可能不得不调用本机代码。您可以使用挂钩提供许多自定义项。您将不得不学习一些 Windows API:

Customizing Common Dialog Boxes

Open and Save As Dialog Boxes

GetSaveFileName Function (Using GetSaveFileName from managed code)

OPENFILENAME Structure (Using OPENFILENAME from managed code)

我很久没有做老式的 Windows API 了,所以下面的想法就是:一个想法。也许你可以创建一个钩子,在WM_INITDIALOG 中你可以找到带有文件名的编辑控件。它似乎被命名为edt1。也许您可以修改控件的窗口样式,使其为只读。

但也许这里提供的其他一些答案比破解另存为对话框更好。

【讨论】:

【参考方案3】:

从头开始创建您自己的Savefiledialog

只需创建一个看起来与Savefiledialog 几乎相同但名称为Label 而不是TextBox 的表单。

【讨论】:

无法继承 SaveFileDialog。 SaveFileDialog 不是表单,而只是非托管 API 的一个外观。 无论是作为最终类还是作为 API 的外观,都无法阻止某人编写外观和行为类似于标准组件的自定义对话框。这是一个很好的答案。 创建自己的 SaveFileDialog 需要大量工作,并不是真正的实用解决方案;我们已经为 Creative Docs .NET (creativedocs.net) 完成了它,但结果并不令人满意; shell 的丰富性几乎是不可能重现的,如果你想跨 Windows 版本兼容,那就更少了。

以上是关于禁用部分 SaveFileDialog的主要内容,如果未能解决你的问题,请参考以下文章

仅对部分代码禁用 PHP 警告

如何部分启用/禁用远程推送通知客户端?

我们为啥要禁用关键部分的中断

如何禁用 FCM unity sdk 的 iOS 部分?

禁用部分 SaveFileDialog

禁用 UITableView 浮动部分标题点击?