VSTO中对功能区控件的编程访问

问题描述 投票:6回答:2

我正在Visual Studio 2008中用VSTO编写C#,以便为Office 2007创建外接程序。

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

.net vsto
2个回答
-1
投票

关于操纵RibbonX接口的大量信息:http://msdn.microsoft.com/en-us/office/aa905530.aspx


0
投票

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

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

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

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

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

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

当控件或功能区失效时,其所有回调均同时触发;那些是onActiongetPressedgetImagegetLabel等,或者专门用于此OP:是getText要求提供Microsoft.Office.Tools.Ribbon.RibbonEditBox控件或任何其他带文本控件的内容内容。

这是第二把戏。

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

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

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

但是有一个关于RVD的重要说明:仅在为其设计用途的应用程序设置了RibbonType属性时,功能区才会显示,并且其中一些值未记录。.] >

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

Microsoft.Excel.Workbook
Microsoft.Word.Document
Microsoft.Outlook.Contact 
Microsoft.Outlook.Mail.Read

要使RVD功能区出现在任何这些应用程序中,只需启动RVD,设置RibbonType属性,添加控件并为事件编写代码。 RVD处理所有事情;与Ribbon.XML相比,它使处理色带变得容易得多。

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

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

那个Name属性是为

any

MSO应用程序创建功能区的关键,而不仅仅是已记录的功能区。名称是将功能区链接到应用程序窗口的名称。大多数窗口都有一个默认的命令栏,该命令栏是几十年前的原始版本的后继命令,在大多数情况下,自Microsoft Office 2003以来是看不到的。我只用Access测试过。将来我可能会对其他一些应用程序大吃一惊。[我将提供一个我现在正在研究的项目的示例:一个用于Word的VSTO加载项,已转换为用于访问的VSTO加载项(process described here)。该项目具有RVD,并且RibbonType属性设置为Microsoft.Access.Database

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

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

'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

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

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

然后,我突然有了一个主意,并想起了共享COM加载项中的那段代码,并尝试了这些步骤:

Microsoft.Access.Standard Microsoft.Access.Database

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

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

© www.soinside.com 2019 - 2024. All rights reserved.