特定の項目の選択にいるContextMenuStripを閉じないでください
-
22-08-2019 - |
質問
これは、特定の項目の選択/確認後にオープンいるContextMenuStripを残すことは可能ですか?
私は(私はメニューまたは右クリックのオプションのいずれかとして同じフィルタを使用することができ、このように)フィルタを設定するには、単純なているContextMenuStripを使用する予定。
メニューは、項目の数を示しています、と私は、ユーザーが基本的なチェック機能を使用して項目の選択を行うことができるようにしたいと思います。選択が完了すると、ユーザは、アクティブ・フィルタ・オプションをクリックするかのどちらかに、メニューの外側をクリックすることができますアクティブにするか、フィルタをキャンセルします。
選択に/メニューは、通常閉じてイベントをクリックします。 それは、クリックイベントに開いたメニューを維持することは可能ですか?
解決
項目がクリックされたときに閉じてからコンテキストメニューを防ぐために、次の操作を行います。
ContextMenuItemsのマウスダウンイベントでは、コンテキストメニューのクロージングイベントで戻ってtrueに設定フラグをfalseに設定します。
例:
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
他のヒント
の場合には、将来のプログラマはこれを行う方法を、これは私が考え出したものです不思議に思っています。任意の項目がクリックされた場合、これは、コンテキストメニューを閉じません。クローズ理由はitemclickedされた場合に文がクローズイベントをキャンセルする場合は、コンテキストメニューストリップクロージングイベントとセットアップANを作成します。
private void contextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked)
e.Cancel = true;
}
Closingイベント
オープンメニューを残すために、真e.Cancel =を設定
唯一の問題は、クリックされたものを使用すると、この自分を追跡する必要があるので、イベントは、あなたを教えてくれないです。あなたが開いているメニューを維持したい項目のClickイベントにフラグのいくつかの種類を設定します。次いで、クロージングイベントにフラグを確認し、適切e.Cancelを設定します。
私がいるContextMenuStripで、このためのプロパティがないと思います。
私たちは私たちのアプリケーションで使用する回避策はいるContextMenuStripのクリックイベントに、我々はいくつかの処理を行うことを、我々は、コンテキストメニューが開いたままにしたい場合は、私たちはもう一度ContextMenuStrip.Showを呼び出すされます。
ているContextMenuStripに一つだけのレベルがある場合は、これはうまく動作します。サブメニューおよびサブサブメニューがある場合は、あなたがクリックする前に開いていたメニューを再度選択しなければならないと私はそれを行うことができるかどうかはわかりません...
OnClosing、DO:e.Cancel = e.CloseReason = ToolStripDropDownCloseReason.CloseCalled。 あなたがクローズすることを決定したとき、その後、閉じる()を呼び出します。
これは私の方法です。それは、ちらつきのないだと - 私が考える - 。もう少し柔軟
あなたはトグルボタン(オン/オフオプション)として使用したいToolStripMenuItemsのセットを持っている場合は、これを試してください:
(ctxWildCards
あるファイルの種類に基づいてフィルタを選択するために使用私のContextMenuStrip
、 - 検索やFileDialogs用)
これは、Visual Basic(!明らかに)です。
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
どのような私は奇妙見つけたのContextMenuStrip.Closing
イベントの前にToolStripMenuItem.Click
イベントが発生するのということです。解決策は、あなたがContextMenuStrip.ItemClicked
を持っているところe.ClickedItem
イベントを使用し、それがクリックされたときに、ContextMenuStrip
を閉じて、適切なフラグを設定しないであろうアイテムの一つだかどうかを確認することでした。フラグも設定されている場合は、ContextMenuStrip.Closing
に、あなたはe.Cancel = true;
を設定することができます。しかしフラグをリセットすることを忘れないでください。
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;
}
}
}
私はちらつきなしでこれを行うために発見された最良の方法は、ドロップダウンメニュー内のすべてのボタンのMouseDownイベントとMouseLeaveイベントを使用することです。
例:
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
私は自分の目的のために、これは有用であることが分かっています。
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
あなたは、タグまたは他のいくつかのプロパティを読み取るためにItemClicked
を使用することができます。
私は、コンテキストメニューが有効に行っていたアイテムのユーザに明らかにしたシンプルなアイテムを望んでいます。