.NET组件编程(7) Component DesignerAction(智能标记)
Msdn上对DesignerActionList和DesignerAction的介绍为:DesignerAction 功能允许组件和控件显示区分大小写的信息和命令。DesignerAction 功能可被视为设计器谓词的替代项,因为 DesignerActionItem 可显示在智能标记面板中,也可显示在与组件或控件相关联的快捷菜单中。对于要在自定义组件和控件中添加智能标记支持的开发人员,DesignerActionList 类表示主交互点。DesignerActionList 是一个基类,组件开发人员可从中派生类来填充智能标记面板。智能标记面板将智能标记表示为类似于菜单的用户界面 (UI)。
DesignerActionItem为智能面板上的一项,我们要向智能面板上添加一项,只要实例化一个DesignerActionItem,DesignerActionList类里有个可以被override的方法GetSortedActionItems()返回类型为DesignerActionItemCollection,它实际上就是返回智能面板上项的集合,我们只要把DesignerActionItem实例添加到GetSortedActionItems()的返回值即可。
在.net中DesignerActionMethodItem、DesignerActionPropertyItem、DesignerActionTextItem、DesignerActionHeaderItem继承于DesignerActionItem,它们的成员大部分都是相同的,DesignerActionMethodItem主要在智能面板上生成一个方法项,点击这个项会去执行相应的方法;DesignerActionPropertyItem则把Component的属性显示在智能面板上,用户可以在职能面板上对Component的属性进行设置和修改;DesignerActionTextItem是在智能面板上生成一个文本项;而DesignerActionHeaderItem是继承于DesignerActionTextItem,但它多了分组的功能。
代码演示如下:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Text;
using System.Reflection;
using System.Windows.Forms;
namespace ClassLibrary1
{
[Designer(typeof(CustomerDesigner), typeof(IDesigner))]
public class Customer : Component
{
private string _id;
private Sex _sex;
private string _address;
public string Id
{
get { return _id; }
set { _id = value; }
}
public Sex Sex
{
get { return _sex; }
set { _sex = value; }
}
public string Address
{
get { return _address; }
set { _address = value; }
}
}
public enum Sex
{
男 = 0,
女 = 1
}
public class CustomerDesigner : ComponentDesigner
{
private DesignerActionListCollection actionLists;
// 只有get,没有set。
public override DesignerActionListCollection ActionLists
{
get
{
if (null == actionLists)
{
actionLists = new DesignerActionListCollection();
actionLists.Add(
new CustomerActionList(this.Component));
}
return actionLists;
}
}
private void OnClick2(object sender, EventArgs e)
{
MessageBox.Show("Click2.");
}
// 添加了一个谓词(在右键菜单中出现)。
// 如果重写了DesignerActionList,则此谓词不会加在智能标记中。
public CustomerDesigner()
{
DesignerVerb verb2 = new DesignerVerb("Click2", new EventHandler(OnClick2));
this.Verbs.Add(verb2);
}
}
// DesignerActionList:智能标记面板上的项列表
public class CustomerActionList : DesignerActionList
{
private Customer customer;
public CustomerActionList(IComponent component) : base(component)
{
this.customer = component as Customer;
}
/*
TypeDescriptor —— 通过类型来获取Component的Attribute、Property、Event。
*/
public string Id // 注1
{
get
{ return customer.Id; }
set
{ TypeDescriptor.GetProperties(typeof(Customer))["Id"]
.SetValue(customer, value);
}
}
public Sex Sex
{
get
{ return customer.Sex; }
set
{ TypeDescriptor.GetProperties(typeof(Customer))["Sex"]
.SetValue(customer, value); }
}
public void OnClick1()
{
MessageBox.Show("Click1.");
}
public override DesignerActionItemCollection GetSortedActionItems()
{
DesignerActionItemCollection items = new DesignerActionItemCollection();
// HeaderItem
// 创建智能面板上项的分类。
DesignerActionHeaderItem hInfo = new DesignerActionHeaderItem("Customer's Info", "Info");
items.Add(hInfo);
DesignerActionHeaderItem hAction = new DesignerActionHeaderItem("Customer's Action", "Action");
items.Add(hAction);
DesignerActionHeaderItem hDescription = new DesignerActionHeaderItem("Description");
items.Add(hDescription);
// PropertyItem
// DesignerActionPropertyItem("Id" —— 注1位置的Property
// , "Id" —— 显示在智能面板上的名称
// , "Info" —— 智能面板上的分类
// ,"Customer's id") —— 补充说明文本
items.Add(new DesignerActionPropertyItem("Id", "Id", "Info", "Customer's id"));
items.Add(new DesignerActionPropertyItem("Sex", "Sex", "Info", "Customer's sex"));
// 添加一个MethodItem。
// 此MethodItem会默认向Component的右键菜单中添加一项。
items.Add(new DesignerActionMethodItem(this, "OnClick1", "Click1", "Action", true));
// 添加一个TextItem.
items.Add(new DesignerActionTextItem("http://mapserver.cnblogs.com", "Description"));
return items;
}
}
}
效果如下:
如果大家有什么问题,请给我留言、或者评论。