Frage

Ist es möglich, eine Context offen nach einer Auswahl / Überprüfung bestimmter Elemente zu verlassen?

Ich plane, ein einfaches Context auf Verwendung eines Filters (So kann ich den gleichen Filter entweder in einem Menü oder als Rechtsklick-Option verwenden könnte) setzen.

Das Menü listet eine Reihe von Punkten, und ich würde der Benutzer eine Auswahl der Elemente in der Lage sein wie mit der Basis-Check-Funktionalität zu machen. Sobald die Auswahl der Benutzer getan wird, kann ein Filter aktivieren Option klicken oder außerhalb des Menüs, um entweder klicken können, aktivieren oder den Filter löschen.

Auf einer Auswahl / Click-Ereignis das Menü normalerweise geschlossen. Ist es möglich, das Menü öffnen, auf einem Click-Ereignis zu halten?

War es hilfreich?

Lösung

die contextmenu Um zu verhindern, zu schließen, wenn ein Element geklickt wird, gehen Sie wie folgt.

Ein Ereignis Mousedown von ContextMenuItems Flag auf false gesetzt es dann auf der Abschlussveranstaltung des contextmenu auf true zurück.

Beispiel:

Private blnClose As Boolean = True

Private Sub MoveUpToolStripMenuItem_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MoveUpToolStripMenuItem.MouseDown

     blnClose = False

End Sub

Private Sub ContextMenuStrip1_Closing(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripDropDownClosingEventArgs) Handles ContextMenuStrip1.Closing

     e.Cancel = Not blnClose
     blnClose = True

End Sub

Andere Tipps

Bei zukünftigen programers fragen sich, wie dies zu tun, das ist, was ich herausgefunden. Dies wird nicht das Kontextmenü schließen, wenn ein Artikel angeklickt wird. Erstellen Sie die Kontextmenü Streifen Abschlussveranstaltung und das Setup einer if-Anweisung die enge Veranstaltung abzusagen, wenn die Nähe Grund itemclicked wird.

private void contextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
    if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked)
        e.Cancel = true;
}

das Closing-Ereignis

gesetzt e.Cancel = true das Menü öffnen

verlassen

Problem ist nur das Ereignis Ihnen nicht sagen, was geklickt wurde, so dass Sie den Überblick über diese selbst zu halten haben. setzen eine Art Flagge in dem Click-Ereignis der Elemente, die Sie das Menü offen halten wollen. dann in der Abschlussveranstaltung die Flagge überprüfen und einstellen e.Cancel angemessen.

Ich glaube nicht, dass es eine Eigenschaft für diesen in der Context ist.

Die Abhilfe wir in unserer Anwendung verwenden, ist, dass auf das Klickereignis der Context wir einige Verarbeitung zu tun, dann, wenn wir das Kontextmenü wollen offen bleiben wir ContextMenuStrip.Show rufen Sie einfach noch einmal.

Das funktioniert gut, wenn es nur eine Ebene der Context ist. Wenn es Untermenü und Sub-Sub-Menü, dann würden Sie haben, um die Menüs erneut auswählen, die vor dem Klick geöffnet waren, und ich bin nicht sicher, wie das getan werden kann ...

OnClosing, do: e.Cancel = e.CloseReason = ToolStripDropDownCloseReason.CloseCalled; und dann, wenn Sie schließen entscheiden, rufen Sie Close ().

Das ist meine Methode; es ist flimmerfrei und - ich glaube -. etwas flexibler

Wenn Sie eine Reihe von ToolStripMenuItems haben möchten Sie als Toggle-Tasten (Option on / off) verwenden, versuchen Sie dies:

(Der ctxWildCards ist nur mein ContextMenuStrip, verwendete Filter zu wählen, basierend auf Dateitypen - für die Suche oder FileDialogs)

Das ist in Visual Basic (natürlich;), so dass Sie Handlers programmatisch oder Verwendung hinzufügen 'Handles ...' Klauseln

.
  Private Sub OnOffToolStripMenuItem_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) 

    Dim t = TryCast(sender, ToolStripMenuItem)
    If Not t Is Nothing Then
        'Since you may have more On/off-Items, check to see if the Owner is the ContextMenuStrip 
        If t.Owner Is ctxWildCards Then
           ' The ContextMenuStrip will stay open on Right-click, i.e. the user can check and close by clicking 'normally'
            ctxWildCards.AutoClose = (e.Button = Windows.Forms.MouseButtons.Left)
        End If
        'Just me using a custom image for checked items.
        t.Checked = Not t.Checked
        t.Image = If(t.Checked, rdoImage, Nothing)
    End If
  End Sub

 ' On leaving ToolStripMenuItems of the ContextMenuStrip, allow it to AutoClose
  Private Sub OnOffToolStripMenuItem_MouseLeave(sender As System.Object, e As System.EventArgs)
  ctxWildCards.AutoClose = True
End Sub

Was ich fand seltsam ist, dass ContextMenuStrip.Closing Ereignis ausgelöst wird vor die ToolStripMenuItem.Click Veranstaltung. Die Lösung war ContextMenuStrip.ItemClicked Ereignis zu verwenden, wo Sie e.ClickedItem haben, und dann prüfen, ob es eines der Elemente ist, die, wenn sie angeklickt, wird nicht die ContextMenuStrip schließen, und stellen Sie die entsprechende Flagge. Dann in ContextMenuStrip.Closing können Sie e.Cancel = true; gesetzt, wenn das Flag gesetzt. Vergessen Sie nicht, wenn das Flag zurückgesetzt wird.

bool isRunAtStartupClicked;
private void ContextMenuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{   
    if (e.ClickedItem == trayIcon.ContextMenuStrip.Items["miRunAtStartup"])
    {   
        isRunAtStartupClicked = true;
    }
}

private void ContextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{   
    if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked)
    {   
        if (isRunAtStartupClicked)
        {   
            isRunAtStartupClicked = false;
            e.Cancel = true;
        }
    }
}

Der beste Weg, fand ich, dies zu tun, ohne Flackern ist die MouseDown- und Leave Ereignisse für jede Taste in dem Drop-Down-Menü zu verwenden.

Beispiel:

Private Sub ToolStripMenuItem2_Mousedown(sender As Object, e As EventArgs) Handles ToolStripMenuItem2.MouseDown
        ΥπηρεσίεςToolStripMenuItem.DropDown.AutoClose = False
End Sub

Private Sub ToolStripMenuItem2_MouseLeave(sender As Object, e As EventArgs) Handles ToolStripMenuItem2.MouseLeave
        ΥπηρεσίεςToolStripMenuItem.DropDown.AutoClose = True
End Sub

Ich fand dieses nützlich für meine Zwecke.

Private Sub CM_Closing(sender As Object, e As ToolStripDropDownClosingEventArgs) Handles CM.Closing
    If e.CloseReason = ToolStripDropDownCloseReason.ItemClicked Then
        Dim ItemClicked As String = CM.GetItemAt(New Point(Cursor.Position.X - CM.Left, Cursor.Position.Y - CM.Top)).Name
        If ItemClicked = "CMHeader" Then
            e.Cancel = True
        End If
    End If
End Sub

Sie könnten ItemClicked verwenden den Tag oder eine andere Eigenschaft zu lesen.

Ich wollte nur ein einfaches Element, das den Benutzer deutlich gemacht, welches Element des Kontextmenü bewirken würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top