删除 ToolStripMenuItem 的优雅方法

Elegant way to remove a ToolStripMenuItem

我正在寻找一种优雅 的方法来从ContextMenu 中删除名为Annotate 的特定菜单项。这就是它的完成方式,所以非常感谢您对此的意见。

public sealed class ContextMenuStripEx : ContextMenuStrip
{
    private readonly ToolStripMenuItem _createAnnotationToolStripMenuItem = new ToolStripMenuItem();
    ...

    public PlotContextMenuStripEx()
    {
        ...
        Items.AddRange(new ToolStripItem[]
                               {
                                   ...
                                   _createAnnotationToolStripMenuItem,
                                   ...
                               });
        // 
        // createAnnotationToolStripMenuItem
        // 
        _createAnnotationToolStripMenuItem.Name = "createAnnotationToolStripMenuItem";
        _createAnnotationToolStripMenuItem.Size = new Size(169, 22);
        _createAnnotationToolStripMenuItem.Image = CommonRes.tsAnnotateM;
        _createAnnotationToolStripMenuItem.Text = "Annotate";
   }
}

现在想象在另一个 class 的其他地方有一个获取 ContextMenuStrip 的调用,类似于:

ContextMenuStrip menuplot = myControl.GetPaneContextMenu();

我想让删除部分更优雅,因为我不想依赖字符串比较。太丑了:

foreach (var item in menuplot.Items)
{
    var name = (item as ToolStripItem).Name;
    if (string.Compare(name, "createAnnotationToolStripMenuItem") == 0)
    {
        // remove the item 
    }
}

请问有更好的方法吗?非常感谢。

我建议:

  • 将菜单项引用 属性 访问器设置为内部,或 public。
  • 另一方面,我会隐藏菜单项而不是删除它们。这可以在 Opening 事件中完成。原因是,当上下文菜单的相同实例被重复使用时,从集合中删除项目可能会很痛苦。

我使用这种方式代替循环和删除:

void menuplot_Opening(object sender, CancelEventArgs e)
{
    ...
    // Accessible menu items are easier to handle
    menuplot.createAnnotationToolStripMenuItem.Visible = false;
    ...
}

开幕式很有趣。例如,它允许您通过设置 e.Cancel = true;

在不满足您的条件时检查并取消弹出窗口的打开