[英]How to access the CustomTaskPanes property aof a VSTO AddIn from a shared library?
我正在为Word,Excel,PowerPoint构建一个AddIn。 该插件具有功能区。 每当用户单击功能区上的按钮时,都会在侧面打开自定义任务窗格。 因为我不想在三个不同的项目中重写相同的代码,所以我有一个共享项目,其中定义了功能区(XML)。
问题:功能区回调必须访问CustomTaskPanes
属性。
我试图将CustomTaskPanes
属性注入到共享功能区:
public partial class ThisAddIn
{
protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
return new Shared.Ribbon(this.CustomTaskPanes);
}
}
public class Ribbon : Office.IRibbonExtensibility
{
private Microsoft.Office.Tools.CustomTaskPaneCollection taskPanes;
public Ribbon(Microsoft.Office.Tools.CustomTaskPaneCollection taskPanes)
{
this.taskPanes = taskPanes;
}
}
但是在执行此方法时, CustomTaskPanes
属性为null
,这意味着我正在注入null
。
更改功能区的构造函数以使我们可以将AddIn注入功能区也不起作用,因为CustomTaskPanes
属性是内部属性,因此代码将引发异常:
public partial class ThisAddIn
{
protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
return new Shared.Ribbon(this);
}
}
public class RecordsRibbon : Office.IRibbonExtensibility
{
private dynamic addIn;
public RecordsRibbon(dynamic addIn)
{
this.addIn = addIn;
}
private void OpenTaskPane()
{
// RuntimeBinderException with message: 'ThisAddIn.CustomTaskPanes' is
// inaccessible due to its protection level
var taskPane = this.addIn.CustomTaskPanes.Add(new UserControl(), "title");
var taskPane.Width = 400;
var taskPane.Visible = true;
}
}
我不想更改ThisAddIn.CustomTaskPanes
属性的访问修饰符,因为它是设计人员生成的代码。
我也尝试了反射,这导致MissingMethodException
。
System.Type t = this.addIn.GetType();
var ctps = t.InvokeMember(
"get_CustomTaskPanes",
BindingFlags.InvokeMethod | BindingFlags.NonPublic,
null,
this.addIn,
null);
var ctps = t.InvokeMember(
"get_CustomTaskPanes",
BindingFlags.GetProperty| BindingFlags.NonPublic,
null,
this.addIn,
null);
var ctps = t.InvokeMember(
"CustomTaskPanes",
BindingFlags.GetProperty | BindingFlags.NonPublic,
null,
this.addIn,
null);
从共享库访问外接程序的自定义任务窗格集合,我还能做什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.