2014-01-22 37 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