Как создать такую ​​панель задач? - PullRequest
0 голосов
/ 11 июня 2018

В Visual Studio 2008,
Если вы создаете форму и помещаете в нее элемент управления,
вы можете редактировать свойства элемента управления через окно свойств.

Некоторые элементы управления позволяют изменять их свойства впо-другому,
в дополнение к окну Свойства.

Это выглядит так:

Кажется, что все элементы управления, которые имеют эту панель, имеютон в том же стиле,
означает, что это то, что предоставляется Visual Studio,
, и создатель элемента управления просто выбирает элементы для включения внутри,
, такие как Поля, и Clickable Links, которые открывают некоторые окна.

Итак, мой вопрос:
Как называется этот элемент управления панели,
и как мне его создать?

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Это меню называется смарт-тегами, и вы можете добавить смарт-тег в свой элемент управления.Для этого вам нужно создать пользовательский Designer для вашего элемента управления и в конструкторе переопределить его свойство ActionLists.

Пример

Допустим, мысоздали элемент управления с некоторыми свойствами, и мы хотим показать следующие свойства нашего элемента управления в окне смарт-тегов:

public Color SomeColorProperty { get; set; }
public string[] Items { get; set; }

И ожидаемый для нас результат:

enter image description here

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 .

Пример загрузки

Рабочий пример можно загрузить из следующего репозитория:

0 голосов
/ 11 июня 2018

Это называется 'DesignerActionList' или SmartTag.Смарт-теги - это элементы пользовательского интерфейса в виде меню, которые предоставляют часто используемые параметры времени разработки.

Шаг:

Необходимо добавить ссылку на сборку во время разработки, System.Design.dll

Создать класс DesignerActionList и получить ссылку на элемент управления в конструкторе.

public class MyControlTasks : System.ComponentModel.Design.DesignerActionList 
{
  private MyControl myControl;

  private DesignerActionUIService designerActionUISvc = null;

  public MyControlTasks( IComponent component ) : base(component) 
  {
    this.myControl = component as MyControl;
    this.designerActionUISvc =
        GetService(typeof(DesignerActionUIService))
        as DesignerActionUIService;
  }
}

Добавление методов и свойств, которые вы хотите связать с элементами смарт-тегов

Создание базы конструктор для элемента управления

public interface IDesigner {
   void Dispose();
   void Initialize(IComponent component);
   IComponent Component {
        get;
   }
}

Вернуть новый экземпляр класса MyControlTasks, который вы создали ранее.

public override DesignerActionListCollection ActionLists
{
    get
    {   
        var actionLists = new DesignerActionListCollection();
        actionLists.Add(new MyControlTasks(this.Component));
        return actionLists;
    }
}
...