TableLayoutPanelDesiner
является внутренним и имеет зависимости от других внутренних классов, и вы не можете наследовать от него. Кроме того, не стоит создавать новый дизайнер элементов управления для TableLayoutPanel
с нуля, потому что вы потеряете все текущие функциональные возможности дизайнера.
Действительно хороший трюк - найти дизайнера и манипулировать дизайнером во время разработки. Посмотрите на Сделайте что-нибудь! и Back Color новые предметы:
Для этого вы можете найти дизайнера вашего TableLayoutPanel
во время разработки и манипулировать им. Хороший момент в методе OnHandleCreated
. Вы можете получить экземпляр IDesignerHost
из Site
элемента управления, а затем получить конструктор.
Затем вы можете получить текущий список действий для элемента управления, создать новый список действий, содержащий все эти элементы действий, и добавить некоторые новые элементы действий в список.
MyTableLayoutPanel
using System;
using System.ComponentModel.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
public class MyTableLayoutPanel : TableLayoutPanel
{
private IDesignerHost designerHost;
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
if (DesignMode && Site != null)
{
designerHost = Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (designerHost != null)
{
var designer = (ControlDesigner)designerHost.GetDesigner(this);
if (designer != null)
{
var actions = designer.ActionLists[0];
designer.ActionLists.Clear();
designer.ActionLists.Add(
new MyTableLayoutPanelActionList(designer, actions));
}
}
}
}
}
MyTableLayoutPanelActionList
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows;
using System.Windows.Forms.Design;
public class MyTableLayoutPanelActionList : DesignerActionList
{
MyTableLayoutPanel control;
ControlDesigner designer;
DesignerActionList actionList;
public MyTableLayoutPanelActionList(ControlDesigner designer,
DesignerActionList actionList) : base(designer.Component)
{
this.designer = designer;
this.actionList = actionList;
control = (MyTableLayoutPanel)designer.Control;
}
public Color BackColor
{
get { return control.BackColor; }
set
{
TypeDescriptor.GetProperties(Component)["BackColor"]
.SetValue(Component, value);
}
}
private void DoSomething()
{
MessageBox.Show("My Custom Verb added!");
}
public override DesignerActionItemCollection GetSortedActionItems()
{
var items = new DesignerActionItemCollection();
foreach (DesignerActionItem item in actionList.GetSortedActionItems())
items.Add(item);
var category = "New Actions";
items.Add(new DesignerActionMethodItem(this, "DoSomething",
"Do something!", category, true));
items.Add(new DesignerActionPropertyItem("BackColor", "Back Color",
category));
return items;
}
}