2009-05-15 59 views
14

特定の項目の選択/確認後にContextMenuStripを開いたままにすることはできますか?特定の項目の選択時にContextMenuStripを閉じないでください

単純なContextMenuStripを使用してフィルタを設定する予定です(この方法で、同じフィルタをメニューまたは右クリックオプションとして使用できます)。

メニューにはいくつかの項目がリストされています。ユーザーが基本的なチェック機能を使用して項目を選択できるようにしたいと考えています。選択が完了すると、ユーザーは[フィルタを有効にする]オプションをクリックするか、メニューの外側をクリックしてフィルタを有効または無効にできます。

選択/クリックイベントでは、メニューは通常閉じます。 クリックイベントでメニューを開いたままにすることはできますか?

答えて

3

アイテムをクリックしたときにコンテキストメニューが閉じないようにするには、次のようにします。

ContextMenuItemsのmousedownイベントでフラグをfalseに設定した場合、contextmenuのclosingイベントでtrueに戻します。

例:

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 
+5

-1あなたがコーディングしている言語ではない答えと、グローバル変数を使用するように提案した答えを選択しましたか? もっと関連する回答があります。 –

1

ContextMenuStripにこれのプロパティはないと思います。

私たちがアプリケーションで使用する回避策は、ContextMenuStripのクリックイベントで処理を行うことです。コンテキストメニューを開いたままにしておきたい場合は、ContextMenuStrip.Showを再度呼び出します。

ContextMenuStripにレベルが1つしかない場合、これはうまく動作します。サブメニューとサブサブメニューがある場合は、クリック前に開いていたメニューを再選択する必要があります。どうすればいいのか分かりません。

+0

ありがとうございます!私はチェックし、これは1つのレベルのメニューに最適です。 別のオプションがあるかどうかを確認するために、質問をしばらく開いておきます。 – barry

3

閉会イベントオープン

問題のみをメニューを終了する場合はtrue

セットe.Cancel =あなたはこの自分を追跡する必要がありますので、イベントが、クリックされたものを教えてくれないんです。メニューを開いたままにしたいアイテムのClickイベントに何らかのフラグを設定します。 Closingイベントでフラグをチェックし、e.Cancelを適切に設定します。

+0

これはショーソリューションよりもエレガントに動作するようです。提案されたフラグに基づいてContextMenuのClosingイベントでe.Cancelをtrueに設定し、個々のクリックしたアイテムにフラグを設定しました。ただし、Cancelイベントは、終了イベント中にのみ設定されるため、1ステップ遅れています。アイテムのクリックイベントで閉じるイベントのキャンセルフラグを設定する方法はありますか? – barry

0

OnClosing、実行します!e.Cancel = e.CloseReason = ToolStripDropDownCloseReason.CloseCalled。 を閉じてから、Close()を呼び出します。

20

将来のプログラマーがこれをどうやって行うのか疑問に思っている場合は、これが私が理解したものです。これは、アイテムがクリックされた場合にコンテキストメニューを閉じることはありません。コンテキストメニューストリップの終了イベントを作成し、close reasonがitemclickedの場合はcloseステートメントをキャンセルするifステートメントを設定します。

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

本当の正解答え – Alex

+0

私が質問を正しく理解している場合、これは本当に完全に答えるわけではなく、一部の項目に対してコンテキストメニューを開いたままにしたいだけです。例えば。コンテキストメニュー項目は、オプションA、オプションB、オプションC、および承諾です。オプションの1つがクリックされた場合(オプションがチェックされている場合)コンテキストメニューを開いたままにする必要がありますが、[Accept]をクリックするとコンテキストメニューを閉じる必要があります。 – jonvw

0

これを行うには、DropDownメニューのすべてのボタンで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 
1

これは私の方法です。それはちらつきのない、そして - 私は思う - 少し柔軟です。あなたはトグルボタン(オン/オフオプション)として使用したいToolStripMenuItemsのセットを持っている場合は

は、これを試してみてください。

ctxWildCardsは、ファイルの種類に基づいてフィルタを選択するために使用される、ちょうど私のContextMenuStripです - 検索またはFileDialogsの場合)

これはVisual Basic(明らかに!)であるため、Handlersをプログラムで追加するか、 'Handles ...'節を使用して追加することができます。

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 
1

何私は奇妙な発見したContextMenuStrip.ClosingイベントがToolStripMenuItem.Clickイベントが発生していることです。解決方法はe.ClickedItemContextMenuStrip.ItemClickedイベントを使用し、クリックしたときにContextMenuStripを閉じずに適切なフラグを設定する項目の1つであるかどうかを確認することでした。 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; 
     } 
    } 
} 
0

これは私の目的に役立ちます。

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を使用することができます。

コンテキストメニューが有効になるアイテムをユーザーに明確にした単純なアイテムがほしいと思っただけです。

関連する問題