程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET組件編程(7) Component DesignerAction(智能標記)

.NET組件編程(7) Component DesignerAction(智能標記)

編輯:關於.NET

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

效果如下:

如果大家有什麼問題,請給我留言、或者評論。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved