Дизайнер и унаследованный ContextMenuStrip
У меня проблема, что дизайнер не добавляет наследуется ContextMenuStrip
к components
, Вот как воспроизвести проблему:
- Создать новый проект (приложение Windows Forms).
Добавить в форму
ContextMenuStrip
через конструктор он сгенерирует это:private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); ... }
Создайте
MyContextMenuStrip
учебный класс:public class MyContextMenuStrip : ContextMenuStrip { }
Скомпилируйте и добавьте в форму
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);