在V#中将VSTO功能区暴露给VisibleChanged事件

时间:2015-06-29 22:23:12

标签: c# ms-word vsto

我正在使用C#VSTO为Word 2010创建应用程序级加载项。我想要在加载项的自定义任务窗格被隐藏或可见时访问加载项功能区的get_Pressed回调方法。但是,为了做到这一点,我需要将功能区用于myTaskPane_VisibleChanged类中的ThisAddIn事件。我无法使用Ribbons集合,因为加载项中的功能区是使用功能区XML创建的,而不是使用Visual Studio的功能区设计器创建的。

ThisAddIn课程中我有:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    myTaskPane.VisibleChanged += new EventHandler(myTaskPane_VisibleChanged);
}

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
    return new myRibbon();
    //I tried playing with IRibbonExtension here, but could not get that to work
}

public void myTaskPane_VisibleChanged(object sender, System.EventArgs e)
{
    //Here is where I would like to access the ribbon
    //I think the command would look something like:
    //myRibbon.IsTaskPaneVisible = !myRibbon.IsTaskPaneVisible;
   //myRibbon is not accessible here
}

在myRibbon课程中,我有:

public class myRibbon : Office.IRibbonExtensibility
{
    public Office.IRibbonUI ribbon;

    private bool isTaskPaneVisible;

    public bool IsTaskPaneVisible
    {
        get { return isTaskPaneVisible; }
        set
        {
            isTaskPaneVisible = value;
            ribbon.InvalidateControl("rxtglElementsPane");
        }
    }

public bool rxtglElementsPane_get_Pressed(Office.IRibbonControl control)
{
    try
    {
        switch (control.Id)
        {
            case "rxtglElementsPane":
                return isTaskPaneVisible;
            default:
                return false;
        }       
        catch
        {
            return false;
        }
    }
}

此代码大部分基于本文:

Synchronizing Ribbon and Task Pane

在评论中,作者提到CreateRibbonExtensibilityObject中生成的代码包括功能区的实例化。当我创建加载项时,Visual Studio 2013没有生成此类代码。

非常感谢从ThisAddIn课程访问功能区的任何帮助。

2 个答案:

答案 0 :(得分:2)

MSDN Visual Studio论坛的Starain Chen向我提供了我在那里发布的帖子的答案:

MSDN Expose VSTO Ribbon to VisibleChanged event in C# Answer

解决方案是使用ThisAddIn类型为myRibbon类定义字段/属性。

public partial class ThisAddIn
{
   internal myRibbon myRibbon;
   ...
    protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject()
    {
        myRibbon=new myRibbon();
        return myRibbon;
    }
}

答案 1 :(得分:0)

无需访问功能区对象。相反,您可以使用Globals.ThisAddin属性访问加载项类。有关详细信息,请参阅Global Access to Objects in Office Projects。因此,您将能够修改可在Ribbon回调中使用的任何局部变量。

您可以在MSDN的以下系列文章中阅读有关Fluent UI(又名Ribbon UI)的更多信息:

Customizing the 2007 Office Fluent Ribbon for Developers (Part 1 of 3)

Customizing the 2007 Office Fluent Ribbon for Developers (Part 2 of 3)

Customizing the 2007 Office Fluent Ribbon for Developers (Part 3 of 3)