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">
我重新审视了我编写的代码并确认这解决了问题。
我正在使用 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">
我重新审视了我编写的代码并确认这解决了问题。