如何在Word 2016中禁用“另存为”选项卡

时间:2019-04-12 08:03:51

标签: c# ms-word vsto

我有一个为Word 2010开发的VSTO加载项,目前正在升级到Office2016。我要做的一件事是,在功能区xml中,禁用另存为命令(<命令idMso =“ FileSaveAs” getEnabled =“ IsFileSaveAsEnabled” ...>)与某些文档。但是,似乎Microsoft已将无法动态禁用的新的“另存为”选项卡添加到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>

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

那么是不是只能按照我想要的方式禁用此选项卡,还是需要做一些新的事情?我在网上真的找不到其他任何东西。

3 个答案:

答案 0 :(得分:0)

如果可见性应视情况而定,则该设置必须是动态的。这意味着它需要回调而不是静态设置:

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

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

我假设您已经有初始化代码中的Ribbon对象(GetCustomUIRibbon_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;
    }

答案 1 :(得分:0)

当我想到解决方法时,我将在这里回答我自己的问题。与其尝试与内置的“另存为”选项卡进行交互,不如将其永久隐藏,并添加我自己创建的该选项卡的副本,以使其外观和行为与内置选项卡完全相同。需要做更多的工作,但是想不出其他方法。

答案 2 :(得分:0)

我没有Word 2016,所以我无法验证这一点,但是当它是“另存为”时,您可能会截获save事件并中止。

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

我在外接程序中执行了类似的操作,并且效果很好。