我正在使用C#VSTO为Word 2010创建应用程序级加载项。该加载项具有自定义任务窗格,其可见性由功能区上的切换按钮控制。功能区已使用XML(而不是Visual Studio Designer)创建。
当我从加载项的功能区外部调用ribbon.Invalidate
时,我无法刷新功能区,因为它为空。我收到一个发出消息的System.NullReferenceException:
对象引用未设置为对象的实例
我怀疑功能区是null,因为在调用时不会加载基础XML。我尝试了很多东西,包括
Invalidating Ribbon from Outside Ribbon
建议在Office.IRibbonUI
类中定义类级ThisAddIn
,并在Ribbon_Load
回调中设置此值。我仍然收到了这个和我做的所有其他尝试的例外。这是我的代码:
在myRibbon
课程中我有:
[ComVisible(true)]
public class myRibbon : Office.IRibbonExtensibility
{
public Office.IRibbonUI ribbon;
private bool isTaskPaneVisible;
public bool IsTaskPaneVisible
{
get { return isTaskPaneVisible; }
set
{
isTaskPaneVisible = value;
// This is where the null exception is thrown
ribbon.Invalidate();
}
}
和
public void Ribbon_Load(Office.IRibbonUI ribbonUI)
{
this.ribbon = ribbonUI;
}
在ThisAddin
课程中我有:
public partial class ThisAddIn
{
internal myRibbon myRibbon;
和
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
myRibbon = new myRibbon();
return myRibbon;
}
从功能区外部调用ribbon.Invalidate
以使其正常运行的任何帮助都将非常感激。
答案 0 :(得分:2)
发布此问题超过两年半后,解决方案在我处理不同的VSTO项目时找到了我。问题在于VSTO项目的XML。
ribbon.Invalidate
为空,因为
public void Ribbon_Load(Office.IRibbonUI ribbonUI)
{
this.ribbon = ribbonUI;
}
为ribbon
分配了一个空值。 ribbonUI
为空,因为功能区XML文件缺少对Ribbon_Load
的引用。
所以读取原始XML文件
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" xmlns:nsCustom="Custom Namespace">
但它应该包含onLoad="Ribbon_Load"
<customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2009/07/customui" xmlns:nsCustom="Custom Namespace">
我重新访问了我编写的代码,并确认这解决了这个问题。
答案 1 :(得分:0)
在尝试使用IRibbonUi实例之前是否调用了Ribbon_Load回调?
如果尚未调用Load回调,则无需调用 Invalidate 方法。事实是你的回调将在Load 1之后第一次自动调用。
在MSDN中的以下系列文章中阅读有关Fluent UI(aka Ribbon UI)的更多信息: