删除 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;
在不满足您的条件时检查并取消弹出窗口的打开
我正在寻找一种优雅 的方法来从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;