无法通过回调直接以编程方式访问功能区控件属性。但是,Visual Studio 有一个可视化功能区设计器,确实 允许直接访问。我将在下面描述这两个主题。
使用功能区回调时,项目代码无法与控件对话,它只能侦听。单行道,代码只能等待IRibbonUI为用户触发的任何控制功能发送回调请求。
更改控件属性的唯一方法是“重新启动”它。正确的术语是Invalidate。单个控件或整个程序员定义的自定义功能区都可能无效。这是通过以下两种方法完成的:
Microsoft.Office.Core.IRibbonUI.Invalidate()
Microsoft.Office.Core.IRibbonUI.InvalidateControl(String) '"SomeControlName"
控件的属性在首次创建或失效时设置。大多数属性在首次初始化时可以在Ribbon.XML 中设置。同样,大多数属性都可以在触发控件失效时设置。
这就是诀窍。嗯,实际上这是两个技巧中的第一个。
当控件或功能区失效时,其所有回调同时触发;那些是onAction、getPressed、getImage、getLabel 等,或者专门针对这个 OP:它是 getText 要求 Microsoft.Office.Tools.Ribbon.RibbonEditBox 控件的内容,或者任何其他带有文本的控件内容。
这是第二个技巧。
类或模块代码必须保留自己的私有变量来表示功能区控件属性的当前值。然后当控制回调被触发时,IRibbonUI 本质上是在询问属性应该是什么,并且代码应该以所需的值回复。
瞧!简而言之,这就是整个过程。
但是...如上所述,还有另一种方法:功能区可视化设计器 (RVD),它使用 Microsoft Visual Studio Tools for Office (VSTO) 作为与功能区相关的所有内容的包装器 .在这样做的过程中,它提供了经典的“指向&双击”技术来创建每个程序员都习惯的事件处理程序。它就像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 中看到这一点。有用于Debug、Build、Standard 和许多其他用途的命令栏。并且所有版本的 Microsoft Office 都有 VBA 编辑器,它仍然使用经典的命令栏。
Name 属性是为任何 MSO 应用程序创建功能区的关键,而不仅仅是记录在案的应用程序。名称是将功能区链接到应用程序窗口的名称。大多数窗口都有一个默认的命令栏,它是几十年前的原始命令栏,在大多数情况下,自 Microsoft Office 2003 以来就没有出现过。嗯……也许吧。我只用 Access 测试过它。将来我可能会尝试其他一些应用程序。
我将提供一个我现在正在处理的项目中的示例:一个用于 Word 的 VSTO 外接程序,它已转换为用于 Access 的 VSTO 外接程序 (process described here)。项目有一个 RVD,RibbonType 属性设置为Microsoft.Access.Database。
注意:RibbonType 的下拉清单可能很棘手。它不喜欢未记录的值。如果键盘焦点选项卡通过该字段并且该值未记录,它将被删除。为了让它粘住,必须通过在其他地方单击鼠标来“点击”焦点。有可能以某种方式将Ribbon.Designer.VB中的Me.RibbonType = ""重新编码为其他一些语法,但这可能会干扰设计器的正常操作,我还没有尝试过。
我发现这个细节隐藏在设计师为 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 中。
对不起,如果这篇文章啰嗦了。我希望它可以帮助其他人。