7

我正在开发一个带有自己的功能区选项卡的 Word 加载项。我的大部分实际代码都包含在一些服务类中,这些类在 ThisAddIn_Startup 中初始化并分配给 ThisAddIn 单例对象的属性。我还有一个事件侦听器,用于侦听剪贴板事件,我想将这些事件作为同一对象的属性公开给其余代码。

我遇到的问题是我的 Ribbon 的 Load 事件在 ThisAddIn 的 Startup 事件之前触发(即使单例对象已经被初始化并分配给 Globals.ThisAddIn)。在我的 Ribbon 的 Load 事件处理程序中,我想在该侦听器上安装一个处理程序并使用其中一项服务。但是,我不能,因为在程序执行的这一点上它们是空的。

这个问题的最佳解决方案是什么?我可以将所有这些东西都设为 ThisAddIn 的静态成员并在静态构造函数中对其进行初始化,但这似乎是错误的,并且还会破坏拥有 Startup 事件(或单例对象)的全部意义。

奇怪的是,当我的 Ribbon 只是将其组件添加到内置的 Add-In 选项卡时,我最初没有遇到这个问题 - 然后在 Startup 之后触发了 Load 事件。

(注意:我在 Visual Studio 2012 中执行所有这些操作并使用功能区设计器。)

4

2 回答 2

5

为此,我将覆盖BeginInit方法。根据我的经验,事件按顺序发生(功能区/初始化相关):

  1. 创建RibbonExtensibilityObject
  2. 开始初始化
  3. 获取自定义用户界面
  4. Ribbon_Load
  5. ThisAddIn_Startup
于 2013-04-18T15:34:52.473 回答
1

我已经测试了tinamou的解决方案,它不再起作用了。Ribbon_load 确实发生在 BeginInit 之后,但在此步骤中,功能区是固定的并且是只读的。无法添加组按钮..(但是可以修改动态菜单)。

我认为最好的方法(稳定)是预加载几个组等。并使用visibility控件的属性来获得一种动态功能区。

另请参阅此帖子根据办公产品的语言本地化 VSTO 插件,似乎CreateRibbonExtensibilityObject 是随机触发的。

于 2016-10-13T23:02:32.933 回答