【问题标题】:Word Add-in: Disable "Save as" based on document's pathWord 加载项:根据文档的路径禁用“另存为”
【发布时间】:2021-04-29 18:57:08
【问题描述】:

我需要编写一个 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-Handler:让我显示一个错误对话框,但不隐藏“另存为”
  • 在 xml 中使用 getVisible 而不是 visible 来引用回调:回调从未被调用,即使在通过ribbon.Invalidate() 使功能区失效后也不会调用

非常感谢您的帮助。谢谢。

【问题讨论】:

  • 您使用的是哪种插件技术?使用 getVisible 或 getEnabled 回调将是您唯一的选择。通过回调向我们展示您的解决方案中用于处理功能区的相关代码。另请注意:文件菜单中的某些命令无法删除,但可以禁用。也试试 getEnabled,看看是否可行。
  • 请注意,您在加载项中执行的任何操作都将应用于所有文档。只有保存在 in 文档中的功能区自定义才会应用于该文档。功能区自定义可以通过其 Open XML 文件格式添加到文档中,例如使用 Open XML SDK。
  • @CindyMeister:我认为内置命令(如“另存为”)不支持“getVisible”/“getEnabled”回调。
  • 感谢辛迪和尼古拉的澄清!如果我不能在不向每个文档添加自定义的情况下更改每个文档的功能区,那么这个问题就得到了回答。
  • 我并不是说你不能 - 我只是说在文档中保存功能区自定义是将某些内容直接关联/链接到文档的唯一方法。应该可以使用代码以某种形式动态地完成它。但是您确实需要提供我要求的其他信息,以便我们有一个有效的起点。

标签: c# ms-word ribbon office-addins


【解决方案1】:

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

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" xmlns:x="MyComAddin.Connect" onLoad="RibbonOnLoad">
    <commands>
        <command idMso="TabSave" getEnabled="GetEnabledCallback" />
    </commands>
    <backstage onShow="BackstageOnShowCallback">
    </backstage>
</customUI>

然后只需从 BackstageOnShowCallback 和 DocumentChange 事件调用 Ribbon.Invalidate()(DocumentChange 事件以及在您想要控制的文档和您不想控制的文档之间切换会产生不一致的结果)。

它只需要 Ribbon.InvalidateControlMso("TabSave") - 但如果你想对按钮 FileSave、FileSaveAs 等做同样的事情,那么全局 Ribbon.Invalidate() 会更简单。

有点令人惊讶的是,Command 回调可以在内置选项卡等上工作,而后台的同一件事却不能。

【讨论】:

  • 我删除了答案,因为它是一个 naa:从一个问题开始,以“对你的想法感兴趣”结束。如果您进行编辑以使其看起来更像一个答案,我可能会考虑取消删除
【解决方案2】:

有点晚了,但认为这可能会有所帮助..

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

功能区 XML:

<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;
    }
}

-- 编辑--

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多