3

実行時に生成できる動的なコンテキストメニューを作成するためのソリューションを考え出そうとしています。IGuiCommand通常のコマンドパターンに似たものを実装するインターフェイスを実装しました。

interface IGuiCommand
{
    Execute();
    Undo();
    bool CanUndo {get;set;}
    Redo();
    string CommandName {get;set;}
    string CommandDescription {get;set;}
}

アイデアは、右クリックされたコントロールがそれ自身のコマンドのリストを送信して、特定のコンテキストメニューに表示できるようにすることです。

各コントロールにコンテキストメニューを作成させることもできますが、単一のコンテキストメニューを使用し、メニューを動的に生成して、実行時の管理を容易にすることをお勧めします。制御状態またはアプリケーション状態が変化した場合、コンテキストメニューにその変化を反映させたいのですが。たとえば、チェックボックスを右クリックすると、チェックボックスはコンテキストメニューに送信され、チェックボックスの現在のチェック値に応じて[有効]または[無効]コマンドが表示されます。

特定のコントロールのコンテキストメニューを表示するために、どのコントロールが「右クリック」されたかを知る方法があれば、これを簡単に実装できると思います。

イベントが右クリックされたコントロール(またはコンテキストメニューをポップアップさせるコマンド)を示すものをContextMenu提供しないのは驚くべきことのようです。EventArg

4

1 に答える 1

2

ContextMenuStrip_Opening イベントをオーバーライドするだけです。送信者オブジェクトは、SourceControl 要素を含む ContextMenuStrip です。適切なキャストを適用すると、必要なものすべてにアクセスできます。

private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) {
  var contextMenu = (sender as ContextMenuStrip);
  if (contextMenu != null) {
    var sourceControl = contextMenu.SourceControl;
    contextMenuStrip1.Items.Clear();
    //contextMenuStrip1.Items.Add(...);
  }
}
于 2013-03-15T17:23:11.700 に答える