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

ribbon.Invalidate Null Exception in C# VSTO add-in

我正在使用 C# VSTO 创建 Word 2010 的应用程序级加载项。该加载项有一个自定义任务窗格,其可见性由功能区上的切换按钮控制。功能区是使用 XML(不是 Visual Studio Designer)创建的。

当我从加载项的功能区外部调用 ribbon.Invalidate 时 class 我无法刷新我的功能区,因为它为空。我收到 System.NullReferenceException 并发出消息:

Object reference not set to an instance of the object

我怀疑功能区为空,因为调用时未加载底层XML。我尝试了很多东西,包括

Invalidating Ribbon from Outside Ribbon

建议在 ThisAddIn class 中定义一个 class 级 Office.IRibbonUI,并在 Ribbon_Load 回调中设置它的值。我仍然收到了这个例外以及我所做的所有其他尝试。这是我的代码:

myRibbon class 我有:

[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 class 我有:

public partial class ThisAddIn
{
    internal myRibbon myRibbon;

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
    myRibbon = new myRibbon();
    return myRibbon;
}

在从功能区 class 外部调用时让 ribbon.Invalidate 正常运行的任何帮助将不胜感激。

在您尝试使用 IRibbonUi 实例之前是否调用了 Ribbon_Load 回调?

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

在 MSDN 中的以下系列文章中阅读有关 Fluent UI(又名功能区 UI)的更多信息:

在发布这个问题两年半之后,我在处理另一个 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">

我重新审视了我编写的代码并确认这解决了问题。