Domanda

Così ho questo menu contestuale lavorare fuori, tranne che l'evento dietro la selezione vera e propria della voce di menu sembra di sparare più volte. La prima volta che lo scatto, si spara una volta, poi due volte, poi 3 volte. Così, nell'esempio ho appena dato, per 3 clic sarebbe sparato un totale di 6 volte (1 + 2 + 3). Perché?

Di seguito è riportato il mio codice su come sto creando le voci di menu. Ho messo a nudo verso il basso per i pezzi rilevanti; Ho omesso le cose come .Tag, .Visible, e le proprietà .Caption. Sto costruendo questo usando .NET 3.5 e VS 2008.

Grazie in anticipo !!

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
È stato utile?

Soluzione

ho capito. tobrien, ho usato il tuo ultimo commento come un veicolo per venire a questa conclusione, in particolare quando hai detto:

  

potrebbe essere che il vostro in realtà la creazione AGGIUNTIVE (identico signitured) callback

Il codice che sto usando per aggiungere il gestore è:

AddHandler thisButton.Click, AddressOf OnContextClick

Come potrebbe essere identico signatured? Beh, c'è solo un OnContextClick sub ... quindi che dire di 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

Questo codice viene eseguito quando si verifica OnUpdate, che, come sapete, accade tutto il tempo. Quindi, in sostanza, ogni volta colpi OnUpdate, io sono l'aggiunta di un gestore aggiuntivo per la stessa identica BUTTON, non considerando che il pulsante è fondamentalmente creato recentemente ogni volta che si verifica OnUpdate e che il suo gestore è memorizzato nella memoria.

Quindi, avevo bisogno di fare il controllo pulsante unico:

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

Ho aggiunto un Now.ToBinary (). ToString () alla fine della proprietà .Tag per garantire che ogni volta che il pulsante è stato creato per l'utente, ha un unico tag. Ora gli eventi sono unici e il suo unico tiro una volta per ogni clic.

tobrien, ti soluto! Anche se in ultima analisi, ha risposto alla mia domanda, non senza la vostra guida. Grazie!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top