2015-11-12 5 views
1

Мне нужно автоматизировать создание и настройку нескольких элементов управления в форме в режиме разработки.Автоматизация создания управления в дизайне окон.

Для этого я создаю элемент управления, который взаимодействует и изменяет некоторые другие элементы управления в форме и устанавливает значения по умолчанию, добавляет столбцы в сетки ... После этого я удаляю элемент управления и все.

Это не совсем сложная техника для создания специальных макросов, но она работает как очарование, чтобы облегчить повторяющиеся свойства настройки работы, особенно с «большими» объектами с большим количеством элементов, таких как сетки.

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

public partial class ButtonCreator : UserControl 

    [Category("Automation")] 
    public int LeftPosition { get; set; } 

    [Category("Automation")] 
    public bool AutoCreate 
    { 
     get { return false; } 
     set 
     { 
      var form = FindForm(); 

      if (value) 
      { 
       for (var i = 10; i < 100; i = i + 20) 
       { 
        var button = new Button(){Name = "btn_" + DateTime.Now.Ticks + "_" + i}; 
        form.Controls.Add(button); 
        button.Location = new Point(LeftPosition, i); 
        button.BringToFront(); 
       } 
      } 
     } 
    } 

(я также попытался использовать конструктор компонента с аналогичным кодом, но с тем же результатом, так что этот способ гораздо менее многословным)

Чтобы использовать это, я добавляю экземпляр ButtonCreator в форму, тогда я устанавливаю свойство AutoCreate (в режиме проектирования, из списка свойств). По-видимому, он работает и добавляет кнопки в форму, но они не сериализованы для автогенерированного кода на C#, и я теряю их после сохранения.

Есть ли что-то, что я могу сделать, чтобы заставить их сериализоваться, когда Visual Studio генерирует файл designer.cs?

Рассмотрите это ограничение: это не код, который будет выпущен, просто грязный код для облегчения разработки, поэтому я предпочитаю избегать более сложных методов, чтобы иметь возможность легко вводить изменения, прямо во время кодирования. Следует избегать ссылок на автоматизацию Visual Studio или создавать визуальные расширения студии, если это возможно.

+1

Дизайнер знает фасоль об этих добавленных пуговицах. Вы не можете выбрать их, и вы не сможете их сериализовать. Это должен сделать дизайнер, он должен вызывать IDesignerHost.CreateComponent(). См. Например, System.Windows.Forms.Design.TabControlDesigner.OnAdd(), код, который добавляет две TabPages в TabControl, когда вы отбрасываете его в форме. –

+0

Вы можете найти мой ответ [здесь, о добавлении элементов управления программным способом во время разработки] (http://stackoverflow.com/a/33535154/3110834). –

+0

Я думаю, что вы должны поместить логику в конструктор «Базовая форма» или создать свою форму с помощью шаблона 't4'. –

ответ

1

Согласно комментарию Ханса Пассана, все, что необходимо, - это спросить среду дизайнера о создании объекта, чтобы можно было отслеживать новый компонент.

var host = GetService(typeof(IDesignerHost)) as IDesignerHost; 
    var button = host.CreateComponent(typeof(Button), "someName") as Button; 
    FindForm().Controls.Add(button); 
Смежные вопросы