C# Word加载项:禁用";另存为;基于文件&x27;s路径

C# Word加载项:禁用";另存为;基于文件&x27;s路径,c#,ms-word,ribbon,office-addins,C#,Ms Word,Ribbon,Office Addins,我需要编写一个Word加载项(支持2013+),根据当前打开文档的路径(例如存储位置)有条件地禁用“另存为”选项/选项卡 我使用的是C#,有以下xml,它禁用了选项卡,但遗憾的是,它对每个文档都这样做: <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> <backstage> <button idMso="FileSaveAs" visible="false"/

我需要编写一个Word加载项(支持2013+),根据当前打开文档的路径(例如存储位置)有条件地禁用“另存为”选项/选项卡

我使用的是C#,有以下xml,它禁用了选项卡,但遗憾的是,它对每个文档都这样做:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <backstage>
    <button idMso="FileSaveAs" visible="false"/>
    <tab idMso="TabSave" visible="false"/>
  </backstage>
</customUI>

我试过:

  • DocumentBeforeSave处理程序:允许显示错误对话框,但不隐藏“另存为”
  • 在xml中使用getVisible而不是visible引用回调:从未调用回调,即使在通过ribbon.Invalidate()使功能区无效之后也没有调用回调

如果有任何帮助,我将非常感激。谢谢。

以下方法适用于Word 2013、Word 2016和Word 2019(不允许通过回调隐藏/禁用内置选项卡,但不允许使用命令)


然后,只需从BackstageOnShowCallback和DocumentChange事件调用Ribbon.Invalidate()

它只需要Ribbon.InvalidateControl(“TabSave”)——但是如果您想对按钮FileSave、FileSaveAs等执行相同的操作,那么全局Ribbon.Invalidate()就更简单了


有点令人惊讶的是,命令回调可以在内置选项卡上工作,而在后台却不能。虽然有点晚了,但我认为这可能会有所帮助

功能区xml只是一个字符串,因此可以进行操作

功能区XML:

<backstage>
  <tab idMso="TabSave" visible="%IsSaveTabVisible%"/>
</backstage>
--编辑--


重新阅读您的帖子,并意识到您希望在每次文档更改时都更改可见性。我认为这种方法行不通,因为我认为它只能在Word开始时应用。

您使用的是哪种加载项技术?使用getVisible或getEnabled回调将是您唯一的选择。向我们展示解决方案中用于处理功能区的相关代码以及回调。另请注意:文件菜单中的某些命令无法删除,但可以禁用。请尝试使用getEnabled,看看是否有效。请注意,您在外接程序中所做的任何操作都将应用于所有文档。只有保存在文档中的功能区自定义项才会应用于该文档。例如,可以使用Open XML SDK,通过文档的Open XML文件格式将功能区自定义项添加到文档中。@Cindymister:我认为内置命令(如“另存为”)不支持“getVisible”/“getEnabled”回调。感谢您的澄清,Cindy和Nikolay!如果我不能在不向每个文档添加自定义项的情况下按每个文档更改功能区,那么这个问题就会得到回答。我不是说你不能-我只是说在文档中保存功能区自定义项是将某些内容直接关联/链接到文档的唯一方法。应该可以使用某种形式的代码动态地完成。但你确实需要提供我要求的额外信息,这样我们才有一个有效的起点。我删除了答案,因为它是naa:以一个问题开始,以“对你的想法感兴趣”结束。如果你编辑使它看起来更像一个答案,我可以考虑不删除。
<backstage>
  <tab idMso="TabSave" visible="%IsSaveTabVisible%"/>
</backstage>
public string GetCustomUI(string ribbonID)
{
    try
    {
        string ribbonXml = GetResourceText("Ribbon.xml");
        if (...)
            ribbonXml = ribbonXml.Replace("%IsSaveTabVisible%", "true");
        else
            ribbonXml = ribbonXml.Replace("%IsSaveTabVisible%", "false");
        return ribbonXml;
    }
    catch (Exception ex)
    {
        Message.ShowError(ex);
        return string.Empty;
    }
}