以编程方式访问VSTO中的功能区控件

mco*_*eth 6 .net vsto

我在Visual Studio 2008中使用VSTO编写C#,以便为Office 2007创建一个加载项.

在使用XML定义自定义功能区选项卡后,如何获取功能区中各种控件的引用?我希望能够以编程方式操作EditBox的内容.

spi*_*tor 3

通过回调以编程方式直接访问功能区控件属性是不可能的。但是,Visual Studio 有一个可视化功能区设计器,允许直接访问。我将在下面描述这两个主题。

\n\n

使用功能区回调时,项目代码无法与控件对话,它只能监听。这是一条单行道,密码只能等待IRibbonUI发送用户触发的控制函数的回调请求。

\n\n

更改控件属性的唯一方法是“重新启动”它。正确的术语是Invalidate。单个控件或整个程序员定义的自定义功能区可能会失效。这是通过以下两种方法完成的:

\n\n
Microsoft.Office.Core.IRibbonUI.Invalidate() \nMicrosoft.Office.Core.IRibbonUI.InvalidateControl(String) \'"SomeControlName"\n
Run Code Online (Sandbox Code Playgroud)\n\n

控件的属性是在首次创建或失效时设置的。Ribbon.XML大多数属性可以在首次初始化时设置。同样,大多数属性都可以设置同样,大多数属性可以在触发控件失效时

\n\n

这就是窍门。嗯,实际上这是两个技巧中的第一个。

\n\n

当控件或功能区失效时,其所有回调都会同时触发;那些是onAction,,,,等等,或者专门针对这个OP:它要求agetPressed的内容getImagegetLabelgetTextMicrosoft.Office.Tools.Ribbon.RibbonEditBox,或任何其他具有文本内容的控件。

\n\n

这是第二个技巧。

\n\n

类或模块代码必须保留自己的私有变量来表示功能区控件属性的当前值。然后当控制回调被触发时,IRibbonUI本质上是询问属性应该是什么,并且代码应该回复所需的值。

\n\n

Voil\xc3\xa0!\xc2\xa0\xc2\xa0 简而言之,这就是整个过程。

\n\n

然而...如上所述,还有另一种方法:功能区视觉设计器 (RVD),它使用 Microsoft Visual Studio Tools for Office (VSTO) 作为与功能区相关的所有内容的包装器。为此,它提供了每个程序员都习惯的创建事件处理程序的经典“点击和双击”技术。它的工作原理就像Windows Forms. 只需双击 RVD 中的任何控件即可直接转到_Click代码中该控件的事件。RVD 甚至还添加了额外的功能,例如Ribbon_Close()事件,可用于保存控件的当前状态等操作。

\n\n

但关于 RVD,有一个重要的要点:只有在RibbonType为其设计的应用程序设置其属性时,功能区才会出现,功能区才会出现,并且某些值未记录......!

\n\n

这些RibbonType值遵循以下通用格式:Microsoft.AppName.MainCommandBarNameRibbonType记录的值可以在RVD 属性面板框的下拉列表中看到。一些值是:

\n\n
Microsoft.Excel.Workbook\nMicrosoft.Word.Document\nMicrosoft.Outlook.Contact \nMicrosoft.Outlook.Mail.Read\n
Run Code Online (Sandbox Code Playgroud)\n\n

要让 RVD 功能区出现在任何这些应用程序中,只需启动 RVD、设置属性RibbonType、添加控件并为事件编写代码即可。RVD 负责处理这一切;它使得使用丝带比使用丝带更容易Ribbon.XML

\n\n

但 VSTO 仅被提升为与某些 Microsoft Office 应用程序一起使用,例如 Excel、Word、Outlook 等。我说“提升”是指上面提到的“未记录”部分。VSTO 可与许多甚至所有Microsoft Office 应用程序配合使用。只需知道主命令栏名称即可。

\n\n

大多数多年来使用 Microsoft Office 命令栏和功能区的程序员可能都知道功能区源自命令栏系统,并采用了一些相同的术语、方法和值。每个命令栏都有一个Name. 如果右键单击命令栏区域,则可以在 Visual Studio 中看到这一点。有用于DebugBuildStandard和许多其他用途的命令栏。所有版本的 Microsoft Office 都有 VBA 编辑器,它仍然使用经典的命令栏。

\n\n

该属性是为任何MSO 应用程序(而不仅仅是记录的应用程序)Name创建功能区的关键。该名称是将功能区链接到应用程序窗口的名称。大多数窗口都有一个默认命令栏,该命令栏源自几十年前的原始命令栏,在大多数情况下自 Microsoft Office 2003 以来就没有出现过。嗯...也许吧。我只用 Access 测试过它。将来我可能会尝试其他一些应用程序。

\n\n

我将提供我现在正在处理的一个项目的示例:将 Word 的 VSTO 外接程序转换为 Access 的 VSTO 外接程序(此处描述的过程)。该项目有 RVD,RibbonType属性设置为Microsoft.Access.Database

\n\n

注意: 的下拉清单RibbonType可能很棘手。它不喜欢未记录的值。如果键盘焦点通过该字段并且该值未记录,则它将被删除。为了使其粘住,必须通过在其他地方单击鼠标来“单击出”焦点。也许可以以某种方式重新编码Me.RibbonType = ""Ribbon.Designer.VB其他语法,但这可能会干扰设计器的正常操作,我还没有尝试过。

\n\n

我发现这个细节隐藏在设计者为 Visual Studio COM 共享加载项创建的原始代码中:

\n\n
\'Set up a custom button on the "Standard" commandbar.\nTry\n    oStandardBar = oCommandBars("Standard")\nCatch ex As Exception\n    \'Access names its main toolbar Database.\n    oStandardBar = oCommandBars("Database")\nEnd Try\n
Run Code Online (Sandbox Code Playgroud)\n\n

就在那里。大多数 MSO 应用程序都有一个名为 的默认工具栏Standard,但对于 Access 来说,它是Database。我一直在为我的 Access RVD 尝试各种字符串,但没有一个有效:

\n\n
Microsoft.Access\nMicrosoft.Access.Application\nMicrosoft.Access.Application.ActiveWindow\nEtc.\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我突然有了一个想法,想起了 Shared COM Add-in 中的那段代码并尝试了这些:

\n\n
Microsoft.Access.Standard\nMicrosoft.Access.Database\n
Run Code Online (Sandbox Code Playgroud)\n\n

还有宾果游戏..!当我按下 时,我的 RVD 功能区神奇地出现在 Access 中F5

\n\n

抱歉,如果这篇文章变得冗长。我希望它可以帮助其他人。

\n