Элегантный способ удалить ToolStripMenuItem
Я ищу элегантный способ удалить определенный пункт меню под названием 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 ответ
Решение
Я предлагаю:
- наличие пунктов меню ссылается на свойства доступа, установленные как внутренние или открытые.
- С другой стороны, я бы скрывал пункты меню, а не удалял их. Это можно сделать в
Opening
событие. Причина в том, что удаление элементов из коллекции может быть болезненным для последующей обработки, когда один и тот же экземпляр контекстного меню используется повторно.
Вместо цикла и удаления я использую этот способ:
void menuplot_Opening(object sender, CancelEventArgs e)
{
...
// Accessible menu items are easier to handle
menuplot.createAnnotationToolStripMenuItem.Visible = false;
...
}
Открытие мероприятия интересно. Например, он позволяет проверить и отменить открытие всплывающего окна, если ваши условия не выполняются путем настройки e.Cancel = true;