События в надстройке InfoPath 2010 - PullRequest
0 голосов
/ 16 сентября 2011

В настоящее время я пытаюсь реализовать простую надстройку для режима заполнителя / редактора InfoPath 2010, которая добавляет несколько кнопок на ленте «Вставить», которая при нажатии вставляет некоторые «шаблонные» данные из другого источника.

Работает нормально, но меня раздражает то, что, когда у пользователя нет выбранного поля, оно остается включенным, в то время как все остальные кнопки на панели инструментов вставки каким-то образом «знают», что ничего нельзя вставить в текущий контекст, и поэтому отключен.

Документация MSDN о том, как взаимодействовать с базовым XDocument, вполне адекватна, но я пытаюсь выяснить, как взаимодействовать или получать информацию из пользовательского интерфейса редактирования.

Вот что я хотел бы иметь:

  • Событие, которое вызывается при переходе пользователя от поля к полю в форме
  • Затем вы сможете определить, в какое поле пользователь вводит данные (например, форматированный текст, простой текст и т. Д.), Поэтому дополнительные кнопки можно включать или отключать по мере необходимости.

Я думал, что это будет довольно просто, но я провел почти день, просматривая все, что могу найти, и оказался пустым!

Или я здесь полностью упустил смысл?

1 Ответ

0 голосов
/ 04 апреля 2012

Несколько месяцев спустя я наконец могу ответить на свой вопрос. Не то, чтобы кто-то использовал наполнитель 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-ответа, но это должно дать кому-то здравому смыслу понять, как это реализовать.

...