[英]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.