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