Контрол на основе старого

148
23 марта 2019, 18:00

Создаю контрол TabPage на основе старого:

public partial class TabControl2 : TabControl
{
  [Browsable(false)]
  [EditorBrowsable(EditorBrowsableState.Never)]
  public new TabPageCollection TabPages { get; } // скрыли родную коллекцию страниц
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  public List<TabPage> UserPages { get; set; } = new List<TabPage>(); // новая коллекция страниц
}

Мне требуется внедрить новую коллекцию страниц, чтобы в дизайнере можно было добавлять/удалять страницы и устанавливать у них нужные свойства(public List - класс TabPage будет расширен, в него будут добавлены новые свойства). При текущем объявлении свойство видимо в дизайнере, функционирует - но не полностью(код из файла форма.Designer.cs):

   this.tabPage1 = new System.Windows.Forms.TabPage();
   // 
   // tabPage1
   // 
   this.tabPage1.Location = new System.Drawing.Point(0, 0);
   this.tabPage1.Name = "tabPage1";
   this.tabPage1.Size = new System.Drawing.Size(200, 100);
   this.tabPage1.TabIndex = 0;
   this.tabPage1.Text = "tabPage1";
   private System.Windows.Forms.TabPage tabPage1;

Как видно - страница создалась, но не вызвался метод Add свойства Control родительского объекта. Как правильно объявить новое свойство UserPages, чтобы в файле форма.Designer.cs код генерировался полностью?

Answer 1

Подведу краткий итог исследования вопроса и обсуждения в комментариях:

То что вы хотите реализовать можно, но придется руками писать дизайнер, который сможет подхватить студия.

Для этого понадобится создать наследника ParentControlDesigner, оригинал можно подсмотреть с помощью DotPeek (другими до internal классов добраться не удалось) в System.Windows.Forms.Design.TabControlDesigner (System.Design.dll)

Когда все будет готово, повесить на кастомный контрол DesignerAttribute

[Designer("<namespace>.CustomTabControlDesigner")]
class CustomTabControl : TabConrol { ... }

Непосредственно реализация дизайнера и контрола останется за рамками данного вопроса, я не слишком силен в данной магии, чтобы понятно и кратко изложить только необходимое, но если кто-то наберется энтузиазма и осилит, я с удовольствием почитаю. (может когда-нибудь и сам соберусь, но это не точно)

Замечания по поводу специализированной коллекции для вложенных табов, остаются в силе, однако с учетом изучения кода штатного дизайнера, это не позволит получить сколь-нибудь существенное облегчение работы, так как создание стандартных TabPage "прибито гвоздями", и для изменения данного поведения дизайнера придется его переписывать.

READ ALSO
Можно ли связать LuaJIT с C#?

Можно ли связать LuaJIT с C#?

Хотелось бы узнать, есть ли способ использовать библиотеку LuaJIT в программе, написанной на C# по аналогии с C/C++Т

154
EntityFramework 6.2.0 проблемы с выполнением запросов

EntityFramework 6.2.0 проблемы с выполнением запросов

Мы используем связку (клиент WPF) -> EF 62

133
Тернарная функция не равна if при DateTime?

Тернарная функция не равна if при DateTime?

Сегодня столкнулась вот с такой проблемойПочему If и тернарная функция не равны

168
Как сгладить Polyline в WPF?

Как сгладить Polyline в WPF?

У меня есть в WPF область Grid, где я задаю множество точек в PointCollection и добавляю это в PolylineПолучаю, соответственно, ломаную кривую

188