【问题标题】:Programmatic access to Ribbon controls in VSTO以编程方式访问 VSTO 中的功能区控件
【发布时间】:2010-03-25 17:20:26
【问题描述】:

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

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

【问题讨论】:

  • 有大量关于操作 RibbonX 界面的重要信息:msdn.microsoft.com/en-us/office/aa905530.aspx
  • 一般情况下不会。您设置代表您调用的“回调”。其中一些“获取”启用状态、“获取”文本或“获取”图像等。
  • 随机:@mcoolbeth 有史以来最酷的 SO nick。

标签: .net vsto


【解决方案1】:

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

使用功能区回调时,项目代码无法与控件对话,它只能侦听。单行道,代码只能等待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 本质上是在询问属性应该是什么,并且代码应该以所需的值回复。

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

但是...如上所述,还有另一种方法:功能区可视化设计器 (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 中看到这一点。有用于DebugBuildStandard 和许多其他用途的命令栏。并且所有版本的 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 中。

对不起,如果这篇文章啰嗦了。我希望它可以帮助其他人。

【讨论】:

  • 请注意,这里的原始问题是之前提出的,有一个功能区设计师......
  • 实际上,它会帮助网站更多地提出一些针对性更窄的问题,您可以针对这些问题撰写非常有针对性的答案。这将打破“啰嗦”,让其他人更容易找到/消化信息。在 Stack Overflow 上,您可以自行回答。
  • 好吧,很难整理出版本。最初的问题是在 2010 年 3 月 25 日提出的。我有 Visual Studio 2008,据我所知,它总是有 RVD;它有 MSO 2003 和@007 的设计师。我检查了添加/删除程序(它是 XP vm lol),我有 VS 2008 Pro、MSO 2007 Pro、VSTO 2005 2nd Ed 和 VSTO Runtime 3。所以我不确定 RVD 来自哪里。 =-S
  • 正如你所说,我正在考虑就这个主题提出/回答我自己的问题。据我所知,微软的 Andrew Whitechapel 是唯一一个提到这一点的人,而且只提到过两次并埋头于 VSTO 讨论。在我发现 Access 的未记录的 RibbonType 值后,我在谷歌上搜索了“Microsoft.Access.Database”这个短语,他的两篇文章是整个互联网上唯一提到的,其中一篇是在他的博客上的访问者评论中,两者都链接在下面:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多