几个月后,我终于可以回答我自己的问题了。并不是说有人使用 InfoPath 填充器,但以防万一有人这样做,这是我的解决方案:
我原来的问题有几点。
1)当用户从一个字段更改为另一个字段时触发的事件:
这在功能区按钮 XML 中被指定为“getEnabled”属性。每次 InfoPath 认为可能需要启用或禁用按钮时,都会调用指定的函数。在我的我指定:getEnabled="OnButtonGetEnabled",然后实现一个小功能:
public bool OnButtonGetEnabled(Office.IRibbonControl control)
{
ribbon.Invalidate();
return HaveRichTextFieldSelected(GetContextXPath());
}
在我的例子中,'ribbon' 是我的 Office.IRibbonUI 实例。调用“Invalidate()”非常重要,否则 InfoPath 只会调用一次。
2)如何判断用户选择的字段类型。
我仍然对我的解决方案不满意,但至少我现在有一些可行的方法。
我写了两个函数:
1:调用 Globals.ThisAddIn.Application.ActiveWindow.XDocument.View.GetContextNodes() 的 GetContextXPath(),从结果中构建一个 XPath 字符串(向后遍历 DOM 树)
2:HaveRichTextFieldSelected() 检查指定的 XPath 在清单中是否为“丰富”类型(其 DOM 树位于 Globals.ThisAddIn.Application.ActiveWindow.XDocument.Solution.DOM 下)
无论如何,我不会在这里发布所有涉及的代码,因为它对于一个 SO 答案来说太多了,但这应该给一些有常识的人一个关于如何实现这个的线索。