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

ribbon.Invalidate C#VSTO加载项中的Null异常,c#,ms-word,vsto,office-addins,C#,Ms Word,Vsto,Office Addins,我正在使用C#VSTO为Word 2010创建应用程序级外接程序。外接程序具有自定义任务窗格,其可见性由功能区上的切换按钮控制。功能区是使用XML(而不是Visual Studio设计器)创建的 当我从外接程序的ribbon类外部调用ribbon.Invalidate时,我无法刷新我的ribbon,因为它为空。我得到一个System.NullReferenceException,它发出以下消息: 对象引用未设置为对象的实例 我怀疑ribbon是空的,因为调用它时未加载底层XML。我试过很多东西,

我正在使用C#VSTO为Word 2010创建应用程序级外接程序。外接程序具有自定义任务窗格,其可见性由功能区上的切换按钮控制。功能区是使用XML(而不是Visual Studio设计器)创建的

当我从外接程序的ribbon类外部调用
ribbon.Invalidate
时,我无法刷新我的ribbon,因为它为空。我得到一个System.NullReferenceException,它发出以下消息:

对象引用未设置为对象的实例

我怀疑ribbon是空的,因为调用它时未加载底层XML。我试过很多东西,包括

这建议在
ThisAddIn
类中定义类级别
Office.IRibbonUI
,并在
Ribbon\u 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 partial class ThisAddIn
{
    internal myRibbon 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 partial class ThisAddIn
{
    internal myRibbon myRibbon;


如果您能在从ribbon类外部调用时获得
ribbon.Invalidate
以正确运行,我们将不胜感激

在您尝试使用IRibbonUi实例之前是否调用了Ribbon_加载回调

如果尚未调用加载回调,则无需调用Invalidate方法。事实上,您的回调将在加载一次后第一次自动调用

在MSDN中的以下系列文章中阅读有关Fluent UI(也称为Ribbon UI)的更多信息:


    • 在发布这个问题两年半之后,我在从事另一个VSTO项目时找到了解决方案。问题在于VSTO项目的XML

      ribbon.Invalidate
      为空,因为

      public void Ribbon_Load(Office.IRibbonUI ribbonUI)
      {
          this.ribbon = ribbonUI;
      }
      
      功能区
      指定了空值。而
      ribbonUI
      为空,因为功能区XML文件缺少对
      Ribbon\u Load
      的引用

      因此,原始XML文件将被读取

       <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" xmlns:nsCustom="Custom Namespace">
      

      我重新查看了我编写的代码,并确认这解决了问题。

      我也认为在使用
      RibbonUI
      之前需要调用
      Ribbon\u Load
      。我试图在
      ThisAddIn
      类(
      public Office.IRibbonUI ribbon;
      )中定义类级别的Office.IRibbonUI,但所有试图通过
      ThisAddIn
      中的事件使其无效的尝试都产生了异常。是否有其他方法从
      ThisAddin
      调用
      Ribbon\u Load
      ,以便我可以从Ribbon类之外的事件中使功能区无效?否,在加载回调之前不需要调用invalidate方法。您只需要检查IRibbonUI接口的实例是否为null。如果没有,您可以调用Invalidate方法。我的问题是
      IRibbonUI
      为空,因此当我调用
      ribbon.Invalidate
      时,我会得到异常。ribbon对象及其方法/属性可从
      此Add
      获得。我已尝试从
      VisibleChanged
      DocumentOpen
      中的
      事件处理程序调用
      ribbon.invalidate
      (在ribbon类的
      ISTASKLPAVINIBLE
      属性中)。set属性被调用,但总是例外(我还尝试将
      public Office.IRibbonUI功能区;
      放置在
      ThisAddin
      中,但也没有运气。)感谢您提供的任何进一步想法。如果我能投票支持这10万,我会的。这正是我所缺少的。谢谢你发布这个!
       <customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2009/07/customui" xmlns:nsCustom="Custom Namespace">