14

特定のアイテムを選択/チェックした後、ContextMenuStripを開いたままにすることは可能ですか?

単純なContextMenuStripを使用してフィルターを設定することを計画しています(このようにして、メニューまたは右クリックオプションのいずれかで同じフィルターを使用できます)。

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

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

4

9 に答える 9

26

将来のプログラマーがこれを行う方法を疑問に思っている場合に備えて、これが私が考え出したことです。いずれかの項目がクリックされた場合、これはコンテキスト メニューを閉じません。コンテキスト メニュー ストリップの終了イベントを作成し、終了理由が itemclicked の場合に終了イベントをキャンセルする if ステートメントを設定します。

private void contextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
    if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked)
        e.Cancel = true;
}
于 2012-05-18T22:59:54.220 に答える
4

クロージングイベント

e.Cancel = true を設定して、メニューを開いたままにします

唯一の問題は、何がクリックされたかをイベントが教えてくれないことです。そのため、自分でこれを追跡する必要があります。メニューを開いたままにしたい項目の Click イベントに何らかのフラグを設定します。次に、Closing イベントでフラグを確認し、e.Cancel を適切に設定します。

于 2009-05-24T02:42:33.133 に答える
3

項目がクリックされたときにコンテキスト メニューが閉じないようにするには、次の操作を行います。

ContextMenuItems の mousedown イベントでフラグを false に設定し、コンテキストメニューの終了イベントで 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
于 2009-07-09T10:28:27.470 に答える
2

私が奇妙だと思ったのは、ContextMenuStrip.Closingイベントがイベントのに発生することToolStripMenuItem.Clickです。ContextMenuStrip.ItemClicked解決策は、あなたが持っているイベントを使用e.ClickedItemし、クリックしても閉じないアイテムの1つであるかどうかを確認し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;
        }
    }
}
于 2016-07-29T13:15:29.270 に答える
1

OnClosingは、次のようにします。e.Cancel = e.CloseReason!= ToolStripDropDownCloseReason.CloseCalled; 次に、閉じることにした場合は、Close()を呼び出します。

于 2009-09-17T08:00:31.280 に答える
1

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

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

これは、ContextMenuStrip に 1 つのレベルしかない場合にうまく機能します。サブメニューとサブサブメニューがある場合、クリックする前に開いていたメニューを再度選択する必要があり、それを行う方法がわかりません...

于 2009-05-15T15:48:57.347 に答える