質問

これは、特定の項目の選択/確認後にオープンいる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を使用することができます。

私は、コンテキストメニューが有効に行っていたアイテムのユーザに明らかにしたシンプルなアイテムを望んでいます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top