如何禁用 Word 2016 中的 "Save As" 选项卡
How to disable the "Save As" tab in Word 2016
我有一个为 Word 2010 开发的 VSTO 加载项,我目前正在升级到 Office 2016。我做的其中一件事是,在功能区 xml 中,禁用某些文档的另存为命令 ()。但是,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>
确实隐藏了选项卡。虽然这不好,因为所有文档都会发生这种情况,但我希望它是有条件的。
那么是不是无法按照我想要的方式禁用此选项卡,或者我需要做一些新的事情吗?我真的无法在网上找到关于此的任何其他信息。
如果可见性应该是有条件的,那么设置需要是动态的。这意味着它需要 回调 而不是静态设置:
<tab idMso="TabSave" getVisible="procedureName" />
此过程需要在 Ribbon1.cs(或在您的 VSTO 项目中调用 class 的任何内容)以及使控件可见(或不可见)的逻辑 - 与 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;
}
我将在这里回答我自己的问题,因为我想到了解决方法。我不会尝试与内置的另存为选项卡进行交互,而是要永久隐藏它并添加我自己从头开始创建的此选项卡的副本,以使其外观和行为与内置选项卡完全一样。需要更多工作,但想不出任何其他方法。
我没有 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;
}
我在 add-in 中做了类似的事情,效果很好。
我有一个为 Word 2010 开发的 VSTO 加载项,我目前正在升级到 Office 2016。我做的其中一件事是,在功能区 xml 中,禁用某些文档的另存为命令 (
禁用另存为命令会影响“另存为”按钮(如果它已添加到快速访问工具栏),但不会影响后台视图中的选项卡。我已经尝试更改此选项卡上的其他内容,它似乎忽略了我尝试进行的任何更改。
我在 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>
确实隐藏了选项卡。虽然这不好,因为所有文档都会发生这种情况,但我希望它是有条件的。
那么是不是无法按照我想要的方式禁用此选项卡,或者我需要做一些新的事情吗?我真的无法在网上找到关于此的任何其他信息。
如果可见性应该是有条件的,那么设置需要是动态的。这意味着它需要 回调 而不是静态设置:
<tab idMso="TabSave" getVisible="procedureName" />
此过程需要在 Ribbon1.cs(或在您的 VSTO 项目中调用 class 的任何内容)以及使控件可见(或不可见)的逻辑 - 与 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;
}
我将在这里回答我自己的问题,因为我想到了解决方法。我不会尝试与内置的另存为选项卡进行交互,而是要永久隐藏它并添加我自己从头开始创建的此选项卡的副本,以使其外观和行为与内置选项卡完全一样。需要更多工作,但想不出任何其他方法。
我没有 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;
}
我在 add-in 中做了类似的事情,效果很好。