Элегантный способ удалить 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;

Другие вопросы по тегам