Это меню называется смарт-тегами, и вы можете добавить смарт-тег в свой элемент управления.Для этого вам нужно создать пользовательский Designer
для вашего элемента управления и в конструкторе переопределить его свойство ActionLists
.
Пример
Допустим, мысоздали элемент управления с некоторыми свойствами, и мы хотим показать следующие свойства нашего элемента управления в окне смарт-тегов:
public Color SomeColorProperty { get; set; }
public string[] Items { get; set; }
И ожидаемый для нас результат:
MyControl
Здесь мы украшаем элемент управления атрибутом Designer
, чтобы зарегистрировать пользовательский конструктор:
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using System.Windows.Forms.Design;
[Designer(typeof(MyControlDesigner))]
public partial class MyControl : UserControl
{
public MyControl()
{
InitializeComponent();
}
void InitializeComponent() { }
public Color SomeColorProperty { get; set; }
public string[] Items { get; set; }
}
MyControlDesigner
Здесь мы переопределяем ActionLists
и возвращаем новый DesignerActionListCollection
, содержащий нужные нам элементы списка действий:
public class MyControlDesigner : ControlDesigner
{
private DesignerActionListCollection actionList;
public override DesignerActionListCollection ActionLists
{
get
{
if (actionList == null)
actionList = new DesignerActionListCollection(new[] {
new MyControlActionList(this) });
return actionList;
}
}
}
MyControlActionList
Здесь мы создаем свойства, которые получают / устанавливают свойства элемента управления.Также мы создаем методы, которые отвечают за показ пользовательского редактора для некоторых свойств или за некоторые действия.Затем верните список элементов действий, переопределив GetSortedActionItems
:
public class MyControlActionList : DesignerActionList
{
ControlDesigner designer;
MyControl control;
public MyControlActionList(ControlDesigner designer) : base(designer.Component)
{
this.designer = designer;
control = (MyControl)designer.Control;
}
public Color SomeColorProperty
{
get { return control.SomeColorProperty; }
set {
TypeDescriptor.GetProperties(
(object)this.Component)["SomeColorProperty"]
.SetValue((object)this.Component, (object)value);
}
}
public void EditItems()
{
var editorServiceContext = typeof(ControlDesigner).Assembly.GetTypes()
.Where(x => x.Name == "EditorServiceContext").FirstOrDefault();
var editValue = editorServiceContext.GetMethod("EditValue",
System.Reflection.BindingFlags.Static |
System.Reflection.BindingFlags.Public);
editValue.Invoke(null, new object[] { designer, this.Component, "Items" });
}
public override DesignerActionItemCollection GetSortedActionItems()
{
return new DesignerActionItemCollection() {
new DesignerActionMethodItem(this, "EditItems", "Edit Items", true),
new DesignerActionPropertyItem("SomeColorProperty", "Some Color"),
};
}
}
Для получения дополнительной информации по этой теме, посмотрите это руководство MSDN .
Пример загрузки
Рабочий пример можно загрузить из следующего репозитория: