Лента VSTO XML: какой обратный вызов вызывается первым

Существует ли порядок, в котором вызываются различные методы обратного вызова get* при создании пользовательской ленты XML в надстройке VSTO (например, getDescription, getEnabled, getVisible и т. д.)?


person whatever    schedule 17.11.2016    source источник


Ответы (1)


Наверняка есть порядок.
Но это внутренняя деталь реализации Office, и на нее абсолютно не следует полагаться.

Единственный порядок, на который вы можете положиться, — это вызов onLoad, который гарантированно будет первым.

Остальные эти методы не должны полагаться друг на друга. Они должны быть реализованы как можно более безгражданными и должны возвращать только запрошенное значение. (Отсюда их имена начинаются с get....)
То есть вы получаете идентификатор элемента управления и должны вернуть какое-то значение - возможно, с некоторой информацией из текущего Excel.Application.

Еще одна дополнительная информация:
Если вам нужно обновить все эти методы get..., вы можете вызвать IRibbonUI.Invalidate().
(Вы получаете экземпляр IRibbonUI в качестве параметра вызова onLoad.)

person haindl    schedule 17.11.2016
comment
Я использовал недействительные для одного или нескольких моих элементов управления на моей пользовательской ленте и заметил, что порядок вызовов различных методов get* всегда одинаков, в пределах одного элемента управления и среди их набора, но для обеспечения например, я ожидал, что метод getVisible будет вызываться первым для каждого элемента управления, поскольку разумно, если элемент управления не виден, другие методы вполне могут не вызываться. Но этого не происходит, оставляя меня в некотором замешательстве. - person whatever; 17.11.2016
comment
@noplace Неудивительно, что порядок звонков остался прежним. Но в разных версиях или выпусках Office он может отличаться и может измениться в любое время без дополнительного уведомления. Я разрабатываю надстройки Excel с использованием COM, пользовательских лент и VSTO уже много лет, и особенно для Office 2016 очень высоки шансы, что даже регулярные автоматические обновления изменят внутреннее поведение и порядок вызовов. Странные COMExceptions и AccessViolations были последствия в моем случае. Могу я спросить: зачем вообще нужен особый порядок звонков? - person haindl; 18.11.2016
comment
В надстройке, которую я недавно разработал, мне, к сожалению, пришлось сохранить состояние, и метод onLoad при аннулировании отдельных пользовательских элементов управления больше не вызывается. Вызывается ли onLoad снова, если вся лента становится недействительной? @haindl, не могли бы вы порекомендовать мне хорошую книгу по теме VSTO (я знаю, что Microsoft продвигает веб-надстройки, но они все еще несколько ограничены).... Я знаю, что тот, который опубликовал мой пресс, является самым последним, но я м не уверен, что это также действительно. - person whatever; 18.11.2016
comment
@noplace Нет, onLoad вызывается только один раз. Но я все еще не понимаю, зачем вам нужно обновлять какое-то состояние в обратных вызовах get*. Как упоминалось в моем ответе, вы можете использовать Excel.Application где угодно. Так что вы можете, например. подпишитесь на WorkbookOpen/De/Activate в методе onLoad и реагируйте на изменения. Вы также можете запросить Application в get* методах, чтобы получить необходимую информацию. Если вам нужно какое-то другое состояние, просто сделайте его независимым от порядка вызова. Я не знаю новых книг по VSTO, но технология точно не изменилась, поэтому вы можете попробовать этот. - person haindl; 18.11.2016
comment
Это не надстройка Excel, а надстройка Outlook, и я могу делать что-то не так из-за моего неправильного понимания того, как все работает. Насколько я понимаю, есть один экземпляр моей пользовательской ленты, который используется в разных окнах проводника/инспектора Outlook. Однако в данный момент лента может иметь другое состояние (также на уровне пользовательского интерфейса) в зависимости от действий пользователя на основе различных окон и отображаемого элемента Outlook. Я могу правильно обрабатывать все, используя пользовательские свойства, которые я прикрепляю к активному элементу в каждом окне, и соответствующим образом отключая элементы управления. - person whatever; 18.11.2016