DotNet(C#)自定义运行时窗体设计器 一
????? 由于項(xiàng)目功能的需要,要做一個(gè)運(yùn)行時(shí)的設(shè)計(jì)器,首先想到的做法就是模仿VS2005的IDE設(shè)計(jì)器,有設(shè)計(jì)窗口,有屬性格等。剛開(kāi)始由于沒(méi)有時(shí)間深入探討,通過(guò)監(jiān)聽(tīng)Windows消息的方法做了一個(gè),效果不是怎么的好,后來(lái)經(jīng)不斷的查資料,發(fā)現(xiàn)Framework已經(jīng)提供了很好的類給我們調(diào)用VS IDE的設(shè)計(jì)器,設(shè)計(jì)終于走上正道,于是重寫(xiě)了原來(lái)的代碼,實(shí)現(xiàn)了運(yùn)行時(shí)設(shè)計(jì)的功能。
???? 我們開(kāi)發(fā)使用到VS的屬性格,其處理錯(cuò)誤的方式對(duì)開(kāi)發(fā)人員來(lái)說(shuō)沒(méi)有什么,但是如果我們把這種提示的方式交給客戶使用,客戶肯定是不滿意的,因此,我們還必須處理錯(cuò)誤提示的形式。對(duì)于有些設(shè)計(jì)時(shí)的控件,其屬性或是唯一或是不斷遞增的,我們也必須要處理,不能給客戶每拖動(dòng)一個(gè)控件,要做一大堆的設(shè)置,只顯示客戶需要的屬性,提供復(fù)制、撤消和恢復(fù)功能等。我們的設(shè)計(jì)器必須有一些智能化的功能在里面,用戶使用起來(lái)才覺(jué)得方便。
????? 在該設(shè)計(jì)器中首先使用到的控件是屬性格控件(PropertyGrid),此處使用了一個(gè)開(kāi)源的屬性格擴(kuò)展控件(PropertyGridEx)該控件對(duì)自定義屬性有很好的處理,這正是我需要的,該控件通過(guò)自定義屬性實(shí)現(xiàn)了一個(gè)消息的提示,相對(duì)Framework中的PropertyGrid有了更好的展現(xiàn),但還不能符合我的要求,還有,對(duì)屬性更改的驗(yàn)證比較麻煩,不靈活,于是本人對(duì)原碼進(jìn)行了小的修改,增加了屬性更改前的驗(yàn)證事件,允許開(kāi)發(fā)人員對(duì)用戶輸入的數(shù)據(jù)時(shí)行驗(yàn)證,由開(kāi)發(fā)人員在些處向用戶作更好的提示,并取消不成功的修改。該修改可能使得控件的整體性差了點(diǎn),但對(duì)開(kāi)發(fā)人員來(lái)說(shuō)更靈活了,可以實(shí)現(xiàn)很復(fù)雜的功能。該控件就不提供原碼了,需要的可以到http://www.codeproject.com/去搜索一下,對(duì)于更改前的驗(yàn)證事件,大家可以去研究研究。在此處說(shuō)說(shuō)該控件的插曲:該控件(屬性格)中修改了某個(gè)值,代碼中是通過(guò)Microsoft.VisualBasic命名空間內(nèi)的Interaction類實(shí)現(xiàn),我相信該類和C#中的Type的反射差不多,于是在完成了整個(gè)IDE的設(shè)計(jì)后才發(fā)現(xiàn),用鼠標(biāo)或鍵盤(pán)移動(dòng)控件,屬性格的值可以改變,但是在屬性格改變控件的位置后,控件是可以正常的起到設(shè)定的位置,但I(xiàn)DE的選中控件的窗口(Hook窗口)并沒(méi)有跟著移動(dòng),改變大小也是一樣。很長(zhǎng)時(shí)間都找不到原因所在,后來(lái)無(wú)意在DesignSurface的代碼中發(fā)現(xiàn)使用的是TypeDescriptor進(jìn)行賦值,于是把原認(rèn)為沒(méi)有問(wèn)題的PropertyGridEx的代碼更改,問(wèn)題解決,我猜想,可以TypeDescriptor更改值的時(shí)候,可能內(nèi)部會(huì)有一個(gè)消息通知機(jī)制,而一般的反射沒(méi)有,而DesignSurface是通過(guò)在內(nèi)部監(jiān)聽(tīng)屬性更改的消息而有所動(dòng)作(沒(méi)有反射Framework的程序集研究)。
效果圖如下:
?
?
待續(xù)...
轉(zhuǎn)載于:https://www.cnblogs.com/Yjianyong/archive/2010/05/25/1743970.html
總結(jié)
以上是生活随笔為你收集整理的DotNet(C#)自定义运行时窗体设计器 一的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 成语小秀才1497关答案 在线成语词典
- 下一篇: 货值金额如何计算 货值金额计算方法