Question

J'ai ce menu contextuel de travail, sauf que l'événement derrière la sélection proprement dite de l'élément de menu semble tirer à plusieurs reprises. La première fois que je clique dessus, il se déclenche une fois, puis deux fois, puis 3 fois. Ainsi, dans l'exemple que je viens de donner, pour 3 clics, il aurait tiré un total de 6 fois (1 + 2 + 3). Pourquoi?

Voici mon code sur la façon dont je crée les éléments de menu. Je retirai vers le bas pour les pièces pertinentes; J'omis des choses comme .Tag, .Visible et propriétés .Caption. Je construis cette aide de .NET 3.5 et VS 2008.

Merci d'avance !!

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
Était-ce utile?

La solution

Je compris. tobrien, j'ai utilisé votre dernier commentaire en tant que véhicule pour arriver à cette conclusion, en particulier lorsque vous avez dit:

  

il se pourrait que votre création effective callbacks SUPPLÉMENTAIRES (identique signitured)

Le code que je utilise pour ajouter le gestionnaire est:

AddHandler thisButton.Click, AddressOf OnContextClick

Comment cela pourrait-il être identique signatured? Eh bien, il n'y a qu'un seul OnContextClick sous ... alors qu'en est 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

Ce code fonctionne lorsque OnUpdate se produit, qui, comme vous le savez, arrive tout le temps. Donc, en substance, chaque fois frappe OnUpdate, j'ajoute un gestionnaire supplémentaire pour le bouton EXACT SAME, ne pas considérer que le bouton est essentiellement nouvellement créé chaque fois OnUpdate se produit et que son gestionnaire est stocké dans la mémoire.

Alors, je devais faire le contrôle unique bouton:

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

Je viens d'ajouter un Now.ToBinary () ToString (). À la fin de la propriété .Tag pour faire en sorte que chaque fois que le bouton est créé pour l'utilisateur, il a une étiquette unique. Maintenant, les événements sont uniques et son tir qu'une seule fois par clic.

tobrien, je vous solutés! Bien que j'ai finalement répondu à ma propre question, il n'a pas été sans vos conseils. Merci!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top