ribbon.Invalidate C#VSTO加载项中的Null异常
我正在使用C#VSTO为Word 2010创建应用程序级外接程序。外接程序具有自定义任务窗格,其可见性由功能区上的切换按钮控制。功能区是使用XML(而不是Visual Studio设计器)创建的 当我从外接程序的ribbon类外部调用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。我试过很多东西,
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">