[英]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.