5

選択したフォルダー内のすべてのフォルダー、サブフォルダー、およびファイルのリストを含むコンテキストメニューを作成しています。メニューがクリックされたときにファイルとフォルダーを開くようにしたいのですが、メニューアイテムにサブアイテムがある場合、クリックイベントは登録されません。

void Foo(string Title)
{
    MenuItem = new MenuItem(Title);
    MenuItem.Click += new EventHandler(MenuItem_Click);
    ContextMenu.MenuItems.Add(MenuItem);
}

void MenuItem_Click(object sender, EventArgs e)
{
    MessageBox.Show("This box will only show when menuitems without subitems are clicked");
}

menuitem にサブアイテムがある場合でも、クリック イベントを発生させるにはどうすればよいですか?

4

3 に答える 3

5

メニューは、ここで最も適切な UI ウィジェットではないかもしれません。クリックイベントが発生しない理由は、サブメニューを持つメニュー項目が、他のアクションを実行するのではなく、クリックされたときにのみ子を展開すると想定されているためだと思います。

それはユーザーの想定でもありそうです。

この動作は、次のドキュメントに記載されていますMenuItem.Click

注: MenuItem の MenuItems プロパティに項目が含まれている場合、このイベントは発生しません。このイベントは、親メニュー項目では発生しません。

于 2009-08-09T15:55:19.643 に答える
1

ツールストリップからポップアップを起動した場合は、ツールストリップをサブクラス化し、このコードを追加できます。

  override protected void OnItemClicked(ToolStripItemClickedEventArgs e)
  {
    if (this.Items.Count == 0)
      base.OnItemClicked(e);

    // else do nothing
  }

ただし、ContextMenu クラスには OnItemClicked はありませんが、onPopup はあります。試したことはありませんが、ContextMenu のサブクラス化を試すことができます

public class MyContextMenu : ContextMenu
{
  override protected void OnPopUp(EventArgs e)
  {
        if (this.MenuItems.Count == 0)
          base.OnPopUp(e);

        // else do nothing
  }
}

それがうまくいかない場合は、2 つの show メソッドをオーバーライドできます

public class MyContextMenu : ContextMenu
{
  override protected void Show (Control c, Point p)
  {
        if (this.MenuItems.Count == 0)
          base.Show (c, p) ;

        // else do nothing
  }

  override protected void (Control c, Point p, LeftRightAlignment z) 
  {
        if (this.MenuItems.Count == 0)
          base.Show (c, p, z) ;

        // else do nothing
  }
}
于 2009-08-10T03:02:56.433 に答える