如何创建这样的任务面板?

How to Create such a Task Panel?

2008 年 Visual Studio,
如果您创建一个表单并在其上放置一个控件,
您可以通过属性 window.

编辑控件的属性

一些控件允许以另一种方式更改它们的属性,
除了属性 window.

看起来像这样:

似乎所有具有此窗格的控件都具有相同的样式,
意思是 Visual Studio,
提供的东西 并且控件的制造者只需选择要包含在其中的项目,
例如字段和可打开一些 windows.

的可点击链接

所以我的问题是:
这个窗格控件的名称是什么,
以及如何创建一个?

这称为 'DesignerActionList' 或 SmartTag。智能标记是类似菜单的用户界面 (UI) 元素,提供常用的设计时选项。

步骤:

您必须添加对设计时程序集的引用,System.Design.dll

创建 DesignerActionList class 并在构造函数中获取对控件的引用。

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;
  }
}

添加要关联到智能标记项的方法和属性

为控件创建基础designer

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

Return 您之前创建的 MyControlTask​​s class 的新实例。

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

该菜单名为 Smart Tags or Designer Actions,您可以将智能标记添加到您的控件中。为此,您需要为控件创建自定义 Designer,并在设计器中覆盖其 ActionLists 属性.

例子

假设我们创建了一个具有某些属性的控件,我们希望在智能标记中显示控件的以下属性 window:

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 和 return 一个新的 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

这里我们创建 get/set 控制属性的属性。我们还创建了负责为某些属性显示自定义编辑器或执行某些操作的方法。然后 return 通过覆盖 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"),
        };
    }
}

有关此主题的更多信息,请查看 this MSDN Walkthrough

下载示例

您可以从以下存储库下载工作示例: