繁体   English   中英

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

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

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

我建议:

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

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

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

开幕活动很有趣。 例如,通过设置e.Cancel = true;您可以检查并取消弹出窗口的打开操作(如果不符合条件) e.Cancel = true;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM