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

时间:2010-03-25 17:20:26

标签: .net vsto

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

Microsoft.Office.Core.IRibbonUI.Invalidate() 
Microsoft.Office.Core.IRibbonUI.InvalidateControl(String) '"SomeControlName"

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

这就是诀窍。好吧,实际上这是两个技巧中的第一个。

当控件或功能区失效时,其所有回调均被同时触发; onActiongetPressedgetImagegetLabel等对象,或者专门针对此OP:getText要求{{1 }}控件,或带有文本内容的其他任何控件。

那是第二招。

类或模块代码必须保留自己的私有变量,以表示功能区控件属性的当前值。然后,当触发控制回调时,Microsoft.Office.Tools.Ribbon.RibbonEditBox本质上是在询问属性应该是什么,并且代码应使用所需的值进行回复。

Voilà!简而言之,这就是整个过程。

但是...如上所述,还有另一种方法:Ribbon Visual Designer(RVD),它使用Microsoft Visual Studio Tools for Office(VSTO)作为 wrapper 处理与Ribbon有关的所有事情。这样,它提供了创建事件处理程序的经典“指向和双击”技术,这是每个程序员都习惯的。它的工作原理类似于IRibbonUI。只需双击RVD中的任何控件即可直接进入代码中该控件的Windows Forms事件。 RVD甚至添加了其他功能,例如_Click事件,可用于保存控件的当前状态之类的事情。

但是,关于RVD有一个重要的观点:仅在针对其设计的应用程序设置了其Ribbon_Close()属性的情况下,功能区才会显示,并且其中一些值未记录。 !

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

RibbonType

要使RVD功能区出现在任何这些应用程序中,只需启动RVD,设置Microsoft.Excel.Workbook Microsoft.Word.Document Microsoft.Outlook.Contact Microsoft.Outlook.Mail.Read 属性,添加控件并为事件编写代码。 RVD可以处理所有这一切;与RibbonType相比,使用色带要容易得多。

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

多年来,使用Microsoft Office命令栏和功能区的大多数程序员可能都意识到功能区是从命令栏系统中发展出来的,并采用了某些相同的术语,方法和值。每个命令栏都有一个Ribbon.XML。如果右键单击命令栏区域,则可以在Visual Studio中看到。有NameDebugBuild和其他许多目的的命令栏。而且所有版本的Microsoft Office都有VBA编辑器,该编辑器仍使用经典的命令栏。

Standard属性是为任何 MSO应用程序创建功能区的关键,而不仅仅是已记录的功能区。名称是将功能区链接到应用程序窗口的名称。大多数窗口都有默认的命令栏,该命令栏是几十年前的原始版本的后继命令,在大多数情况下,自Microsoft Office 2003以来是看不到的。我只用Access测试过。将来我可能会对其他一些应用程序大吃一惊。

我将提供一个我现在正在研究的项目的示例:一个用于Word的VSTO加载项,已转换为用于访问的VSTO加载项(process described here)。该项目具有RVD,并且Name属性设置为RibbonType

注意:Microsoft.Access.Database的下拉清单可能很棘手。它不喜欢未记录的值。如果键盘焦点在该字段之间切换,并且该值未记录,则将其删除。为了使其停留,必须通过在其他地方单击鼠标来“单击”焦点。可能以某种方式将RibbonType中的Me.RibbonType = ""重新编码为其他语法,但这可能会干扰设计人员的正常操作,而我还没有尝试过。

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

Ribbon.Designer.VB

就在那里。大多数MSO应用程序都有一个名为'Set up a custom button on the "Standard" commandbar. Try oStandardBar = oCommandBars("Standard") Catch ex As Exception 'Access names its main toolbar Database. oStandardBar = oCommandBars("Database") End Try 的默认工具栏,但对于Access,它是Standard。我已经为Access RVD尝试了各种字符串,但是没有一个起作用:

Database

然后我突然有了一个主意,并想起了共享COM加载项中的那段代码,并尝试了以下方法:

Microsoft.Access
Microsoft.Access.Application
Microsoft.Access.Application.ActiveWindow
Etc.

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

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

答案 1 :(得分:-1)

关于操作RibbonX界面有很多很好的信息:http://msdn.microsoft.com/en-us/office/aa905530.aspx