2014-01-22 67 views
0

我正在爲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的自定義任務窗格集合?

回答

0
+0

據我瞭解這篇文章,它告訴我必須建立一個共享的AddIn。在那裏,我必須連接Office連接,並實現一些用於自定義任務窗格集合的接口。太多工作。我有一個共享功能區,將被不同的VSTO使用。 Office接口的連接和實現全部由VS完成。因此我決定爲每個ThisAddIn類添加一個公共MyCustomTaskPanes。該屬性只是返回內部的CustomTaskPanes。這種方式注入ThisAddIn並訪問this.addIn.MyCustomTaskPanes工程。 – Yavuz