.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.Collections.Generic;
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;
        }
    }
}

时间: 2024-10-26 18:03:46

.NET组件编程(7) Component DesignerAction(智能标记)的相关文章

.NET组件编程(6) Component Designer

这章主要讲Component的Designer,Designer顾名思义就是为Component设计时服务的,Designer可以 在设计时修改组件的行为,还可以提供它自己的服务和行为. 在.net里要为Control或者Component定制Designer,只要从IDesigner继承下来即可,但是在.net里ms 已经帮我们做了两个从IDesigner继承下来的基类,ComponentDesigner和ControlDesigner, ComponentDesigner是为Componen

.NET组件编程(2) PropertyAttribute和EventAttribute

昨天晚上写了基础篇,有朋友说写的太简单,我想在这里申明下:因为我要写组件编程的完整系列, 所以从最简单的开始写起,而且园子里有很多的朋友可能从来都没有写组件的经历,在这里希望有组件开 发经验的朋友能多多包涵. 前一章,我们创建了最简单的组件,今天讲讲Component的PropertyAttribute和EventAttribute. EventAttribute有: BrowsableAttribute .CategoryAttribute.DescriptionAttribute. Defa

Word2003中如何隐藏智能标记操作按钮?

以下教程介绍Word2003怎样隐藏"智能标记操作"按钮的方法,具体操作步骤如下所述: 隐藏"智能标记操作"按钮 1 打开Word 2003文档,单击"工具"--"自动更正选项" 2 在"自动更正"对话框单击"智能标记"选项卡 3 去掉显示"智能标记操作"按钮的复选框,单击"确定" 隐藏"智能标记" 1 单击菜单栏的"

在Word2007中删除“智能标记”

  如果不再需要在Word文档中显示智能标记,用户可以将其删除,操作步骤如下所述: 第1步,打开Word2007文档窗口,依次单击Office按钮→"Word选项"按钮,如图1所示. 图1 单击"Word选项"按钮 第2步,在打开的"Word选项"对话框中,切换到"校对"选项卡.在"自动更正选项"区域单击"自动更正选项"按钮,如图2所示. 图2 单击"自动更正选项"按

065_《Delphi7组件编程参考手册》

<Delphi7组件编程参考手册> Delphi 教程 系列书籍 (065) <Delphi7组件编程参考手册> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Part1 Part2 Part3 Part4 Part5 Part6 Part7 Part8 Part9 Part10 作者: 本书编写组 丛书名: 软件工程师参考手册 出版社:人民邮电出版社 ISBN:7115117071 上架时间:2003-12-16 出版日期:2003 年11月 开本:1

supermap objects6.0 com组件编程

问题描述 supermapobjects6.0com组件编程中的那个工作控件管理控件中对节点的操作怎么用,比如要获得选中数据集的名称,选中数据源的名称,不知道怎么获得,求大家帮帮忙.. 解决方案 解决方案二: 解决方案三:同问,刚学越到这个问题解决方案四:还是用treeview吧!解决方案五:这个问题说简单挺简单,说复杂还是挺复杂的,建议你先好好看看超图基本知识开发内容,确定了超图的基本框架后再给你说估计更简单.上楼说的用TreeView控件是从程序开发角度,肯定的说一定能实现,但也需要借助超图

.NET组件编程(8) Component DocumentDesigner(文档设计器)

每个Component不但是有Component Designer,而且还有Component DocumentDesigner,但这两个 Designer之间到底有什么样的区别呢?我用比较通俗的讲法来给大家区别下,Component Designer是指一 个Component被拖放到Form或者Page的Container上时所呈现出来的UI设计器(图1):Component DocumentDesigner则是指Component本身根文档设计器(图2). 比如有两个Component,其

深入浅出组件编程之固有属性和事件属性

编程 前一章,我们创建了最简单的组件,今天讲讲Component的PropertyAttribute和EventAttribute. EventAttribute有: BrowsableAttribute .CategoryAttribute.DescriptionAttribute.DefaultEventAttribute PropertyAttribute有: BrowsableAttribute .CategoryAttribute.DescriptionAttribute.Defaul

ASP服务器组件编程心得

编程|服务器|心得 作者;小刀 使用ASP编程的一大优点是可以使用众多的服务器组件(ActiveX Server Components).这些组件提供诸如广告轮显(Ad Rotator).浏览器兼容(Browser Capabilities).数据库存取(Database Access).文件超链接(Content Linking).文件存取(File Access)等等功能.使用服务器组件,可以通过非常简单的方式高效率地完成各种复杂的工作. 一般,ASP的各个组件通常使用 Server.Cre