Кнопка контекстного меню Outlook (надстройка) срабатывает несколько раз за один клик - PullRequest
1 голос
/ 05 марта 2010

Итак, у меня работает это контекстное меню, за исключением того, что событие, стоящее за фактическим выбором пункта меню, похоже, запускается несколько раз. Первый раз, когда я нажимаю на него, он срабатывает один раз, затем дважды, затем 3 раза. Итак, в примере, который я только что дал, за 3 клика он бы сработал в общей сложности 6 раз (1 + 2 + 3). Почему это так?

Ниже приведен мой код о том, как я создаю пункты меню. Я раздели его до соответствующих частей; Я пропустил такие свойства, как .Tag, .Visible и .Caption. Я строю это с использованием .NET 3.5 и VS 2008.

Заранее спасибо !!

Private WithEvents ActiveExplorerCBars As Office.CommandBars
Private app As New Outlook.Application

Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
     ActiveExplorerCBars = app.ActiveExplorer.CommandBars
     AddHandler ActiveExplorerCBars.OnUpdate, AddressOf ActiveExplorerCBars_OnUpdate
End Sub

//This seems to get hit A LOT    
Private Sub ActiveExplorerCBars_OnUpdate()
    Dim bar As Office.CommandBar

    If IgnoreCommandbarsChanges Then Exit Sub

    bar = ActiveExplorerCBars.Item("Context Menu")

    If Not bar Is Nothing Then
        Dim addMenu As Boolean = False
        //this For loop just makes sure the context is only available when the user right-clicks over a mail item
        For Each mail As Outlook.MailItem In Application.ActiveExplorer().Selection
            addMenu = True
            Exit For
        Next
        If addMenu Then
            AddContextDropdown(bar)
        End If
    End If
End Sub

Private Sub AddContextDropdown(ByVal ContextMenu As Office.CommandBar)
    Dim RootPopup As Office.CommandBarPopup
    Dim popupTaskItem As Office.CommandBarPopup
    RootPopup = ContextMenu.FindControl(Type:=Office.MsoControlType.msoControlPopup, Tag:="Update task")

    If RootPopup Is Nothing Then
        ChangingBar(ContextMenu, Restore:=False)
        RootPopup = ContextMenu.Controls.Add(Type:=Office.MsoControlType.msoControlPopup)

        Dim thisTaskPopup As Office.CommandBarPopup
        popupTaskItem = ContextMenu.FindControl(Type:=Office.MsoControlType.msoControlPopup, Tag:=task.EntryID)
        If popupTaskItem Is Nothing Then
              popupTaskItem = RootPopup.Controls.Add(Type:=Office.MsoControlType.msoControlPopup)
              thisTaskPopup = popupTaskItem
              AddActionButtons(thisTaskPopup)
        End If
    End If
End Sub

Private Sub AddActionButtons(ByVal puItem As Office.CommandBarPopup)

    Dim puDeploy As Office.CommandBarPopup = puItem.Controls.Add(Type:=Office.MsoControlType.msoControlPopup)
    Dim btnActionItem As Office.CommandBarControl = puDeploy.Controls.Add(Type:=Office.MsoControlType.msoControlButton)
    Dim thisButton As Office.CommandBarButton = btnActionItem
    AddHandler thisButton.Click, AddressOf OnContextClick
End Sub

//Click event
Public Sub OnContextClick(ByVal ctrl As Microsoft.Office.Core.CommandBarButton, ByRef CancelDefault As Boolean)
   //This messagebox shows once the first time, twice the second, 3 times, etc
    MessageBox.Show("Clicked: " & ctrl.Caption)
End Sub

1 Ответ

1 голос
/ 09 марта 2010

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

возможно, что вы фактически создаете ДОПОЛНИТЕЛЬНЫЕ (идентично подписанные) обратные вызовы

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

AddHandler thisButton.Click, AddressOf OnContextClick

Как это может быть идентично подписано?Ну, есть только один OnContextClick sub ... так что насчёт thisButton ?

For Each value As ActivityType.Request In [Enum].GetValues(GetType(ActivityType.Request))
        Dim btnActionItem As Office.CommandBarControl = puRequest.Controls.Add(Type:=Office.MsoControlType.msoControlButton)
        With btnActionItem
            .Tag = puRequest.Tag & "|" & value
            .Caption = [Enum].GetName(GetType(ActivityType.Request), value)
            .Visible = True
        End With
        Dim thisButton As Office.CommandBarButton = btnActionItem
        AddHandler thisButton.Click, AddressOf OnContextClick
    Next

Этот код запускается при возникновении OnUpdate, который, как вы знаете,случается ВСЕ время.Поэтому, по сути, каждый раз, когда срабатывает OnUpdate, я добавляю дополнительный обработчик для КНОПКИ EXACT SAME, не считая того, что кнопка в основном создается заново каждый раз, когда происходит OnUpdate, и что ее обработчик сохраняется в памяти.

Итак, мне нужно было сделать элемент управления кнопки уникальным:

.Tag = puRequest.Tag & "|" & value & "|" & Now.ToBinary().ToString()

Я просто добавил Now.ToBinary (). ToString () в конце свойства .Tag, чтобы гарантировать, что каждый раз кнопка будетсозданный для пользователя, он имеет уникальный тег.Теперь события уникальны, и их срабатывает только один раз за клик.

Тобриен, я разрешаю вам!Хотя в конечном итоге я ответил на свой вопрос, это было не без вашего руководства.Спасибо!

...