我正在寻找一种优雅的方式来从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
}
}
有没有更好的方法呢?非常感谢。
答案 0 :(得分:0)
我建议:
Opening
事件中完成。原因是,当重复使用上下文菜单的相同实例时,从集合中删除项目可能会很难处理。而不是循环和删除,我使用这种方式:
void menuplot_Opening(object sender, CancelEventArgs e)
{
...
// Accessible menu items are easier to handle
menuplot.createAnnotationToolStripMenuItem.Visible = false;
...
}
开幕活动很有意思。例如,如果您的条件不符合,则可以通过设置e.Cancel = true;