【问题标题】:ribbon.Invalidate Null Exception in C# VSTO add-inRibbon.Invalidate Null 异常在 C# VSTO 加载项中
【发布时间】:2018-02-08 07:01:27
【问题描述】:

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

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

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

我怀疑功能区是空的,因为在调用它时没有加载底层 XML。我尝试了很多事情,包括

Invalidating Ribbon from Outside Ribbon

这建议在ThisAddIn 类中定义一个类级别的Office.IRibbonUI,并在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 以使其正常运行,我们将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 如果我可以投票给这 1000K 我会的。这正是我所缺少的。感谢您发布此信息!
    【解决方案2】:

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

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

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

    【讨论】:

    • 我也相信在使用RibbonUI之前需要调用Ribbon_Load。我试图在 ThisAddIn 类 (public Office.IRibbonUI ribbon;) 中定义一个类级别的 Office.IRibbonUI,但是所有试图从 ThisAddin 内的事件中使其无效的尝试都产生了异常。是否有另一种方法可以从 ThisAddin 调用 Ribbon_Load,以便我可以从功能区类之外的事件中使功能区无效?
    • 不,不需要在 Load 回调之前调用 invalidate 方法。您只需要检查 IRibbonUI 接口的实例是否为空。如果没有,您可以调用 Invalidate 方法。
    • 我的问题是IRibbonUI 为空,所以当我调用ribbon.Invalidate 时出现异常。功能区对象及其方法/属性可从ThisAddin 获得。我尝试从VisibleChangedDocumentOpen 中的ThisAddin 事件处理程序调用ribbon.invalidate(在功能区类的IsTasklPaneVisible 属性中)。调用 set 属性,但总是例外(我也尝试将 public Office.IRibbonUI ribbon; 放在 ThisAddin 中,但那里也没有运气。)感谢您提供的任何进一步的想法。
    猜你喜欢
    • 2014-06-01
    • 2017-10-19
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多