【发布时间】:2016-11-17 14:10:21
【问题描述】:
在 VSTO 加载项中创建自定义 XML 功能区时,是否有调用各种 get* 回调方法(例如 getDescription、getEnabled、getVisible 等)的顺序?
【问题讨论】:
标签: vsto outlook-addin office-addins excel-addins word-addins
在 VSTO 加载项中创建自定义 XML 功能区时,是否有调用各种 get* 回调方法(例如 getDescription、getEnabled、getVisible 等)的顺序?
【问题讨论】:
标签: vsto outlook-addin office-addins excel-addins word-addins
肯定有订单。
但这是 Office 的内部实现细节,您绝对不应该依赖它。
您唯一可以依赖的顺序是onLoad 的调用,它保证先到。
这些方法的其余部分不应相互依赖。它们应该尽可能无状态地实现,并且应该只返回请求的值。 (因此他们的名字以get...开头。)
也就是说,您获得了控件的 id 并且必须返回一些值 - 可能带有来自当前 Excel.Application 的一些信息。
一个附加信息:
如果您需要刷新所有这些get... 方法,可以致电IRibbonUI.Invalidate()。
(您将获得IRibbonUI 的实例作为onLoad 调用的参数。)
【讨论】:
get* 方法的调用顺序始终相同在其中的一组中,例如,我希望首先为每个控件调用 getVisible 方法,因为如果控件不可见,则很可能不会调用其他方法。但这并没有发生,让我有些困惑。
COMExceptions 和AccessViolations 是我的情况的后果。请问:为什么一开始还需要特殊的调用顺序?
onLoad 方法。如果使整个功能区无效,是否会再次调用 onLoad? @haindl 你能给我推荐一本关于 VSTO 的好书吗(我知道微软正在推动 web 插件,但它们仍然有些有限)....我知道我出版的 apress 是最新的,但我我不确定它是否也有效。
onLoad 只被调用一次。但我仍然不明白为什么您需要在get* 回调中刷新某些状态。正如我的回答中提到的,您可以在任何地方使用Excel.Application。所以你可以例如在onLoad 方法中订阅WorkbookOpen/De/Activate 并对更改做出反应。您也可以在get* 方法中查询Application 以获取您需要的信息。如果您需要其他状态,则只需使其独立于调用顺序即可。我知道 VSTO 没有新书,但技术肯定没有改变,所以你可以试试this one。