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