Дизайнер и унаследованный ContextMenuStrip

У меня проблема, что дизайнер не добавляет наследуется ContextMenuStrip к components, Вот как воспроизвести проблему:

  1. Создать новый проект (приложение Windows Forms).
  2. Добавить в форму ContextMenuStrip через конструктор он сгенерирует это:

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
        ...
    }
    
  3. Создайте MyContextMenuStrip учебный класс:

    public class MyContextMenuStrip : ContextMenuStrip
    {
    }
    
  4. Скомпилируйте и добавьте в форму MyContextMenuStrip через конструктор он сгенерирует это:

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
        this.myContextMenuStrip1 = new WindowsFormsApplication1.MyContextMenuStrip();
        ...
    }
    

WTF? Почему это не добавляет MyContextMenuStrip к компонентам???

И мне нужно, чтобы меню присутствовало в components для моего менеджера локализации (для автоматического перевода меню). Я забыл какой-то атрибут, интерфейс или переопределить??

1 ответ

Решение

Visual Studio не инициализирует ваш MyContextMenuStrip с Container потому что ваш элемент управления не имеет конструктора, который принимает Container в качестве параметра.

Создайте конструктор в вашем MyContextMenuStrip это занимает System.ComponentModel.IContainer а затем передать этот параметр в базовый класс вашего элемента управления, используя base ключевое слово:

class MyContextMenuStrip : ContextMenuStrip
{
    public MyContextMenuStrip(System.ComponentModel.IContainer c) : base(c) { }
}

После этого вы обнаружите, что когда вы добавляете MyContextMenuStrip в форму с помощью дизайнера, VS сгенерирует код, который вы хотите в вашей форме InitializeComponent метод:

this.myContextMenuStrip1 = new WindowsFormsApplication1.MyContextMenuStrip(this.components);
Другие вопросы по тегам