12

System.Windows.Forms.ContextMenu を使用しています。一部のボタンをクリックしてもメニューが閉じないようにしたいです。今のところ、クリックするたびに同じ位置でメニューが再度開くように機能しています。唯一の問題は、メニューがちらつくのが見えるため、見栄えが悪いことです。これを行うより良い方法はありますか?

WPF の ContextMenu には StaysOpen プロパティがありますが、Win Forms にはありません。(WPF の ContextMenu を使用する方法はありますか?) ContextMenu の方が見栄えが良いため、これを行うことができる ContextMenuStrip は使用したくありません。

編集:

これを行うのは良くないので、これを解決策としてマークするつもりはありません。私の質問が求めることを行う必要がある場合、1 つの方法は、WPF から UserControl を作成し、コンテキスト メニューを含むオブジェクトを配置して、それにコンテキスト メニューを追加することです。これは WPF にあるため、クリック時にメニューを閉じたくないボタンで、MenuItem のプロパティ StaysOpenOnClick を true に設定します。次に、この UserControl を WinForms アプリに配置します。

4

3 に答える 3

21

次のように、コンテキスト メニューを開いたままにしておくことができます。

private bool CloseContextMenu = true; //Class Variable

次に、コンテキスト メニュー項目に MouseDown を追加します。

private void menu1ToolStripMenuItem_MouseDown(object sender, MouseEventArgs e)
{
    CloseContextMenu = false;
}

次に、コンテキスト メニューの終了イベントで:

private void contextMenuStrip1_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
    e.Cancel = !CloseContextMenu;
    CloseContextMenu = true;
}

その後、CloseContextMenu = false任意のメニュー イベントに を追加できます。

お役に立てれば。

于 2012-07-25T20:37:42.503 に答える
6

ContextMenuコントロールを使用してこれを行う良い方法はありません。これは、ネイティブの Win32 メニューの単なるラッパーです。他のすべてのアプリケーションのメニューと同様に、OS API を使用して描画されます。

ContextMenuStripこれを、フレームワークによって C# コードで完全にカスタム描画されたコントロールと比較してください。それが最初にリリースされたとき、Windows と Office XP が棚の最新の製品だったとき、それは非常にクールに見えました (私は推測します)。Windows Vista が登場したとき、それは恐ろしく時代遅れになりました。唯一の利点、メニューをより細かく制御できることです。たとえば、メニューでカスタム コントロールをホストし、項目の 1 つをクリックしたときにメニューが閉じないようにすることができます。ネイティブの Win32 メニューはそれをサポートしていません。

もちろん、それは単なる見落としや偶発的な省略ではありません。ユーザーが何かを選択した後もコンテキスト メニューを開いたままにしておくことは、設計が間違っていることを示す良い手がかりです。コンテキスト メニューの目的は、コンテキストに関連するオプションにユーザーがすばやくアクセスできるようにすることです。右クリック (またはキーボードの特別なボタンを押す) するだけで、作業中または達成しようとしていることに直接関連する選択肢のメニューが表示されます。通常のメニューと同様に、オプションを選択してメニューを非表示にすることができるはずです。

Windows では、すべてのメニューが「自動終了」です。メニューが永続的である必要がある場合は、メニューであってはなりません。代わりに、ツールバー、サイド バー、または何らかの種類のカスタム コントロールを使用することを検討してください。これらは、オプションの 1 つが選択されたときに消えるように設計されていないため、常に表示されるべき関連オプションを表示するのに理想的です。

オプションを選択した後、アプリケーションのコンテキスト メニューが消えない場合、それはバグだと思います。少なくとも、選択したものが「取得」されなかったと仮定して、もう一度クリックしてみます。

なぜWPFチームStaysOpenがコンテキスト メニューにオプションを提供することにしたのか、そもそもなぜ独自のコンテキスト メニュー クラスを書き直したのか、私にはまったくわかりません。WinForms チームが既に同じことを行っていることから、彼らは何かを学んだのではないでしょうか?

コントロール (およびネイティブ メニュー) で求めていることを実行する唯一の方法ContextMenuは、説明したものと同様のハックです。メニューの前の位置を保存し、コマンドが選択された後にポップを再表示します。メニューを前の場所に移動します。ちらつきに対してどのような治療法を思いついたとしても (たとえば、画面をフリーズさせ、コンテキスト メニューが再表示されるまで再描画を抑制するなど)、病気よりも悪いことがほぼ保証されています。

于 2012-07-25T20:51:27.237 に答える