簡體   English   中英

如何從共享庫訪問VSTO加載項的CustomTaskPanes屬性?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM