Несколько месяцев спустя я наконец могу ответить на свой вопрос. Не то, чтобы кто-то использовал наполнитель InfoPath, но на всякий случай кто-то использует, вот мое решение:
В моем первоначальном вопросе есть несколько моментов.
1) Событие, которое запускается при переходе пользователя от поля к полю:
Оказывается, это указано в XML кнопки ленты как атрибут "getEnabled". InfoPath вызывает указанную функцию каждый раз, когда считает, что кнопка может быть включена или отключена. По моему я указал: getEnabled = "OnButtonGetEnabled", затем реализовал небольшую функцию:
public bool OnButtonGetEnabled(Office.IRibbonControl control)
{
ribbon.Invalidate();
return HaveRichTextFieldSelected(GetContextXPath());
}
в моем случае «лента» - это мой экземпляр Office.IRibbonUI. Вызов «Invalidate ()» очень важен, в противном случае InfoPath вызывает его только один раз.
2) Как определить тип поля, выбранного пользователем.
Я все еще не доволен своим решением для этого, но, по крайней мере, теперь у меня есть кое-что, что работает.
Я написал две функции:
1: GetContextXPath (), который вызывает Globals.ThisAddIn.Application.ActiveWindow.XDocument.View.GetContextNodes (), строит строку XPath из результата (проходя назад по дереву DOM)
2: HaveRichTextFieldSelected (), который проверяет, имеет ли указанный XPath тип 'rich' в манифесте (дерево DOM которого находится в Globals.ThisAddIn.Application.ActiveWindow.XDocument.Solution.DOM)
В любом случае, я не публикую здесь весь задействованный код, так как это слишком много для SO-ответа, но это должно дать кому-то здравому смыслу понять, как это реализовать.