2013-04-11 8 views
1

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

  1. Создать новый проект (приложение для форм окон).
  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. Compile и добавить к форме 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 не инициализирует ваш MyContextMenuStripContainer, потому что ваш элемент управления не имеет конструктора, который принимает параметр 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); 
+0

Спасибо, уже шли другой путь (перечисляя управление и проверяя их 'Control.ContextMenuStrip'), но он не работает хорошо (если' MyContextMenuStrip' не назначается ни одному из элементов управления и предполагается, что он будет показан программно, тогда я не могу его найти) .. а потом вы пришли here = D – Sinatr

+0

@Sinatr Спасибо, я кое-что узнал, и ваш вопрос очень хорошо выложен. –