ribbon.Invalidate C#VSTO加载项中的Null异常

时间:2015-07-03 04:50:47

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

我正在使用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以使其正常运行的任何帮助都将非常感激。

2 个答案:

答案 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)的更多信息: