【问题标题】:Expose VSTO Ribbon to VisibleChanged event in C#在 C# 中将 VSTO 功能区暴露给 VisibleChanged 事件
【发布时间】:2015-07-03 05:11:56
【问题描述】:

我正在使用 C# VSTO 为 Word 2010 创建应用程序级加载项。当加载项的自定义任务窗格隐藏或可见时,我想访问加载项功能区的 get_Pressed 回调方法。但是,为此,我需要将功能区提供给ThisAddIn 类中的myTaskPane_VisibleChanged 事件。我无法使用 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

作者在 cmets 中提到 CreateRibbonExtensibilityObject 中生成的代码包括功能区的实例化。当我创建插件时,Visual Studio 2013 没有生成这样的代码。

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

【问题讨论】:

    标签: c# ms-word vsto


    【解决方案1】:

    MSDN Visual Studio 论坛的 Starain Chen 从我放在那里的帖子中为我提供了答案:

    MSDN Expose VSTO Ribbon to VisibleChanged event in C# Answer

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

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

    【讨论】:

      【解决方案2】:

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

      您可以在 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)

      【讨论】:

      • 感谢@EugeneAstafiev。我无法使用Globals.ThisAddin 类或其他类从myTaskPane_VisibleChanged 访问任何myRibbon 回调、属性或方法。 IntelliSense 无权访问myRibbon。 “没有适用的变量或成员”消息显示。当触发myTaskPane_VisibleChanged 事件时,我看不到链接如何应用于访问_get_Pressed 回调或myRibbon 属性。你能给我一两行访问回调的代码吗?或者提供ThisAddinmyRibbon 类不能通信的一些原因?
      猜你喜欢
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      相关资源
      最近更新 更多