【问题标题】:How to disable the "Save As" tab in Word 2016如何在 Word 2016 中禁用“另存为”选项卡
【发布时间】:2019-07-13 01:22:16
【问题描述】:

我有一个为 Word 2010 开发的 VSTO 加载项,我目前正在升级到 Office 2016。我要做的一件事是,在功能区 xml 中禁用另存为命令 () 与某些文档。但是,微软似乎在 Word 2016 的后台视图中添加了一个新的“另存为”选项卡,我无法动态禁用该选项卡。

如果将另存为按钮添加到快速访问工具栏,禁用另存为命令会影响另存为按钮,但不会影响后台视图上的选项卡。我已尝试更改此选项卡上的其他内容,但它似乎忽略了我尝试进行的任何更改。

我在 VS 2017 中开发,并自动将项目迁移到 Office 2016。

如果我添加

<backstage>
    ...
    <tab idMso="TabSave" getEnabled="IsFileSaveEnabled" />
    ...
</backstage>

对于我的ribbon.xml,未调用 IsFileSaveEnabled。

public bool IsFileSaveEnabled(IRibbonControl control) 
{
    return false; // Not the actual implementation, but you get the idea.
}

事实上,即使将 enabled 属性设置为 false 也无济于事,但是

<backstage>
    ...
    <tab idMso="TabSave" visible="false" />
    ...
</backstage>

实际上隐藏了选项卡。虽然这不好,因为所有文档都会发生这种情况,但我希望它是有条件的。

那么,是否无法按照我想要的方式禁用此选项卡,或者我需要做些什么新的事情?我真的在网上找不到任何关于此的内容。

【问题讨论】:

    标签: c# ms-word vsto


    【解决方案1】:

    我将在这里回答我自己的问题,因为我想到了一种解决方法。我不会尝试与内置的另存为选项卡进行交互,而是将其永久隐藏并添加我自己从头开始创建的该选项卡的副本,以使其外观和行为与内置选项卡完全相同。更多的工作,但想不出任何其他方式来做到这一点。

    【讨论】:

      【解决方案2】:

      如果可见性应该是有条件的,那么设置需要是动态的。这意味着它需要 回调 而不是静态设置:

      <tab idMso="TabSave" getVisible="procedureName" />
      

      此过程需要在 Ribbon1.cs(或在您的 VSTO 项目中调用的任何类)和使控件可见(或不可见)的逻辑 - 与 IsFileSaveEnabled 相同。回调将在第一次加载功能区时触发,并且任何时候控件(或整个功能区)无效(Ribbon.Invalidate/InvalidateControl(controlID))。这通常在 DocumentOpen、DocumentClose、DocumentChange 等事件中完成。

      我假设您已经有了在代码中初始化 Ribbon 对象的过程(GetCustomUI 和 Ribbon_Load)。

      这是我在测试项目中的一个简单示例,用于切换组的可见性:

          private Office.IRibbonUI ribbon; //initialized via Ribbon's load event
          bool bGetVisible = false;
      
          //triggered by clicking a Ribbon control
          public void ShowFontGroup_Click(Office.IRibbonControl ctl)
          {
              bGetVisible = true;
              ribbon.Invalidate(); //triggers all "get" callbacks in the Ribbon
          }
      
          //callback triggered by invalidating the Ribbon
          public bool GroupFont_GetVisible(Office.IRibbonControl ctl)
          {
              return bGetVisible;
          }
      

      【讨论】:

      • 我的问题是没有为 TabSave 调用回调,即使我执行 Ribbon.Invalidate。 TabSave 在 Office 2010 中不存在,因此在 2013 或 2016 中一定是新的。在 2010 中,另存为只是后台中的一个命令,因此禁用该命令可以满足我的需要。在 2016 年,另存为选项卡的行为似乎与其他内置选项卡不同。想知道是否有人知道为什么以及是否有办法解决这个问题。
      【解决方案3】:

      我没有 Word 2016,因此无法验证这一点,但您可能会拦截保存事件并在另存为时中止。

      // this is for a document-level add-in; do this in your startup method
      BeforeSave += new SaveEventHandler(ThisDocument_BeforeSave);
      
      private void ThisDocument_BeforeSave(object sender, SaveEventArgs e)
      {
          e.Cancel = e.ShowSaveAsDialog;
          return;
      }
      

      我在我的插件中做了类似的事情,效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-21
        相关资源
        最近更新 更多