2015-03-17 2 views
1

У меня есть пользовательская лента в Visio, которая отображается правильно, за исключением случаев, когда я нажимаю, чтобы развернуть SplitButton. Когда я расширяю SplitButton, он вызывает обратный вызов GetImage для моей ленты и загружает файл BMP с помощью LoadPicture, но фактически не отображается в Visio. В следующий раз, когда я разберу SplitButton, все будет в порядке.SplitButton GetImage Callback Not Working

Есть ли что-то, что мне нужно сделать в обратном вызове, чтобы подсказка ленты отображалась правильно при использовании SplitButton?

В настоящее время мы используем класс, который реализует IRibbonExtensibility с обратными вызовами для GetImage и OnAction, и они отлично работают для обычных кнопок, но мы получаем это поведение только при использовании SplitButton.

Это то, что я вижу в первый раз, я нажимаю на выпадающий:

The Auto Pipe button is the top level and there should be two buttons in the SplitButton

+0

Вы пробовали ** control.invalidate ** – Arya

+0

Да, я сделал, но это не имело значения. RibbonUI.Invalidate делает это хуже; кнопка SplitButton никогда не появляется. –

ответ

0

Проблема сводилась к использованию инструкции DoEvents, которая была добавлена ​​в наш код трассировки стека в нашей кодовой базе. Каждый раз, когда мы вводим рутину, мы подталкиваем имя подпрограммы в стек вызовов, а затем выставляем ее при выходе, но эта процедура также добавила инструкцию DoEvents, чтобы помочь вырваться из любых циклов во время разработки.

Казалось бы, поскольку мы добавляем ленту через событие Document Created/Opened, выполнение DoEvents должно заставлять Visio неправильно обрабатывать обратные вызовы загрузки ленты. Исправлена ​​проблема с установкой DoEvents.

0

Не ясно, какой код используется для пользовательского интерфейса ленты.

Обратный вызов GetImage должен иметь следующую подпись:

C#: IPictureDisp GetImage(IRibbonControl control) 
VBA: Sub GetImage(control As IRibbonControl, ByRef image) 
C++: HRESULT GetImage([in] IRibbonControl *pControl, [out, retval] IPictureDisp ** ppdispImage) 
Visual Basic: Function GetImage(control as IRibbonControl) as IPictureDisp 

Убедитесь, что вы вернете экземпляр IPictureDisp, который указывает на изображение, которое вы загрузили. См. Chapter 11: Creating Dynamic Ribbon Customizations (2 of 2) для примера кода.

+0

Я отредактировал вопрос, чтобы сказать, как мы это делаем, это стиль Visual Basic, а не VBA. Изображение загружается при первом вызове GetImage, и обратный вызов не вызывается снова во второй раз, когда я нажимаю раскрывающееся меню. –

+1

Обратный вызов не следует вызывать каждый раз, когда вы нажимаете раскрывающееся меню. Дело в том, что пользовательский интерфейс Ribbon кэширует значения. Если вам нужно изменить изображение во время выполнения, вам необходимо использовать [IRibbonUI.Invalidate] (https://msdn.microsoft.com/en-us/library/microsoft.office.core.iribbonui.invalidate%28v=office. 14% 29.aspx? F = 255 и MSPPError = -2147217396) или IRibbonUI.InvalidateControl методы, чтобы заставить приложение Office вызывать ваши обратные вызовы. Дополнительную информацию см. В разделе [Обзор объекта IRibbonUI] (https://msdn.microsoft.com/en-us/library/office/ff869817.aspx?f=255&MSPPError=-2147217396). –

+0

Я знаю, что это кеши, но я пытался сказать, что изображение загружается и кэшируется, но не отображается при первом щелчке по щелчку. Он отображает второй щелчок и, как я уже сказал, (соответственно), без повторного вызова. –