我正在爲Word,Excel,PowerPoint構建一個AddIn。這個AddIn帶有一條絲帶。每當用戶單擊功能區上的按鈕時,都會打開一個自定義任務窗格。由於我不想在三個不同的項目中重寫相同的代碼,因此我有一個共享的項目,其中定義了功能區(XML)。如何從共享庫訪問VSTO AddIn的CustomTaskPanes屬性?
問題:碳帶回調必須訪問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
。
更換色帶的構造器,這樣我們可以注入外接程序的色帶不工作,也因爲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);
我還能做些什麼來訪問共享庫中AddIn的自定義任務窗格集合?
據我瞭解這篇文章,它告訴我必須建立一個共享的AddIn。在那裏,我必須連接Office連接,並實現一些用於自定義任務窗格集合的接口。太多工作。我有一個共享功能區,將被不同的VSTO使用。 Office接口的連接和實現全部由VS完成。因此我決定爲每個ThisAddIn類添加一個公共MyCustomTaskPanes。該屬性只是返回內部的CustomTaskPanes。這種方式注入ThisAddIn並訪問this.addIn.MyCustomTaskPanes工程。 – Yavuz