删除ToolStripMenuItem

时间:2015-11-30 14:36:46

标签: c# contextmenustrip

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

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";
   }
}

现在想象另一个类的其他地方有一个调用来获取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 
    }
}

有没有更好的方法呢?非常感谢。

1 个答案:

答案 0 :(得分:0)

我建议:

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

而不是循环和删除,我使用这种方式:

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

开幕活动很有意思。例如,如果您的条件不符合,则可以通过设置e.Cancel = true;

来检查和取消弹出窗口的打开