Nicht Context zur Auswahl bestimmter Elemente schließen
-
22-08-2019 - |
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?
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
verlassenProblem 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.