Получить настроенный переключатель в надстройке Outlook

Привет, я разрабатываю надстройку для Outlook, в которую я хочу добавить новую настраиваемую кнопку-переключатель на вкладке «Назначение». Когда я сохраняю встречу, я хочу получить текущее состояние кнопки переключения. Это мой код до сих пор:

Итак, кнопка уже создана, но когда я нажимаю «Сохранить», я не могу получить управление кнопкой. Лента1.xml:

<tab idMso="TabAppointment">
        <group id="SalesforceGroup" label="Salesforce">
          <toggleButton id="ImportToSalesforce" size="large"
            label="Import to Salesforce" imageMso="DatabaseInsert"
            getPressed="GetPressed"
            onAction="Salesforce_Click"  />
        </group>
      </tab>

Лента1.vb:

Public Sub GetPressed(ByVal control As Office.IRibbonControl)
        MsgBox("test")   ' This alert only pops up when the appointment window opens
    End Sub

Public Sub Salesforce_Click(ByVal control As Office.IRibbonControl)
    MsgBox("test")    ' This alert never pops up
End Sub

ЭтотAddIn.vb:

Private Sub inspectors_NewInspector(ByVal Inspector As Microsoft.Office.Interop.Outlook.Inspector) Handles inspectors.NewInspector
    If TypeName(Inspector.CurrentItem) = "AppointmentItem" Then
        MsgBox("event")
        oAppointmentItem = TryCast(Inspector.CurrentItem, Outlook.AppointmentItem)
        AddHandler oAppointmentItem.Write, AddressOf Item_Save
    End If
End Sub

Private Sub Item_Save(ByRef Cancel As Boolean)
  'get IRibbonControl
End Sub

ОБНОВЛЕНИЕ: исправлена ​​проблема, из-за которой моя функция onAction никогда не вызывалась из-за неправильной настройки параметра: Ribbon1.vb:

Public Sub Salesforce_Click(ByVal control As Office.IRibbonControl, _
    ByVal isPressed As Boolean)
    MsgBox("test2")
End Sub

Но главный вопрос: как получить состояние кнопки toogle, когда пользователь нажимает «Сохранить»?


person ZerOne    schedule 25.03.2015    source источник


Ответы (2)


Насколько я понимаю вашу основную потребность, вы должны иметь возможность проверять состояние ToggleButton «ImportToSalesforce» при сохранении встречи. Я не уверен, хорошо ли вы используете ленту (созданную из Visual Designer) вместо Ribbon XML (которая более гибкая и требует большего программирования по сравнению с лентой, созданной Visual Designer)

Когда вы создаете ленту с помощью Visual Designer (с необходимой кнопкой переключения), вы можете легко получить доступ к объекту ленты из любого места внутри надстройки, используя коллекцию ленты.

Ленты ThisRibbonCollection = Globals.Ribbons[Globals.ThisAddIn.Application.ActiveInspector()]; ленты.SalesForceRibbon.toggleButton1.Checked ‹-- Это то, что вам нужно!

Если вам действительно нужно использовать XML ленты вместо визуального конструктора ленты, обратитесь к Есть ли способ получить доступ к ленте (XML) во время выполнения?

person Sanjay Karia    schedule 28.03.2015
comment
Нет необходимости перепечатывать ответ заново, тем более копируя идею доступа к элементам управления ленты во время выполнения. - person Eugene Astafiev; 28.03.2015
comment
копируя идею доступа к элементам управления ленты во время выполнения, не могли бы вы объяснить это? - person Sanjay Karia; 29.03.2015
comment
Я уже описал свойство Global.Ribbons для доступа к элементам управления во время выполнения. - person Eugene Astafiev; 29.03.2015
comment
Спасибо вам обоим! Теперь у меня есть доступ к моей кнопке переключения, когда пользователь нажимает «Сохранить». Решение заключалось в том, чтобы создать ленту с помощью Visual Designer, а не с помощью Ribbon XML, как упоминал Санджай. - person ZerOne; 30.03.2015

Вам нужно вызвать функцию GetPressed, объявленную в пользовательской разметке пользовательского интерфейса, в качестве обратного вызова для toggleButton. Он должен выглядеть следующим образом:

C#: bool GetPressed(IRibbonControl control)
VBA: Sub GetPressed(control As IRibbonControl, ByRef returnValue)
C++: HRESULT GetPressed([in] IRibbonControl *pControl, [out, retval]VARIANT_BOOL *pvarfPressed)
Visual Basic: Function GetPressed(control As IRibbonControl) As Boolean

Как видите, он возвращает интересующее вас логическое значение. Если вы не используете параметр в обратном вызове, просто передайте Nothing (null в C#).

Кажется, вы не понимаете, как устроены и должны использоваться обратные вызовы ленты. Я бы рекомендовал прочитать следующую серию статей в MSDN:

Также вам может пригодиться свойство Globals.Ribbons, см. Доступ к ленте во время выполнения для получения дополнительной информации.

person Eugene Astafiev    schedule 26.03.2015
comment
Где я должен поместить функцию? И как мне получить текущее состояние кнопки, когда пользователь сохраняет встречу? - person ZerOne; 26.03.2015
comment
Где вы определили обратный вызов getPressend? - person Eugene Astafiev; 26.03.2015
comment
Должно быть - Sub GetPressed (управление As IRibbonControl, ByRef returnValue) - person Eugene Astafiev; 27.03.2015
comment
и что мне нужно написать в функции GetPressed, чтобы получить состояние кнопки, когда пользователь нажимает «сохранить»? - person ZerOne; 27.03.2015
comment
поэтому для уточнения: кнопка «Сохранить» не является моей настраиваемой кнопкой. Когда пользователь нажимает кнопку «Сохранить и закрыть» (применяется Outlook), я хочу получить состояние моей настраиваемой кнопки. - person ZerOne; 27.03.2015
comment
Если кнопка принадлежит вашему пользовательскому интерфейсу, вы должны знать о текущем состоянии. Обратный вызов GetPressed возвращает значение независимо от того, находится ли кнопка в нажатом состоянии или нет. Второй параметр, передаваемый обратному вызову GetPressed, — это ответ на вопрос. Какое значение вы возвращаете в Office, когда он запрашивает текущее состояние? - person Eugene Astafiev; 27.03.2015
comment
Давайте продолжим обсуждение в чате. - person ZerOne; 27.03.2015