csharp高級屬性定義_第1頁
csharp高級屬性定義_第2頁
csharp高級屬性定義_第3頁
csharp高級屬性定義_第4頁
csharp高級屬性定義_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、C#自定義控件屬性與行為分類: C#2010-10-08 09:49 1337人閱讀 評論(1) 收藏 舉報控件應該定義屬性而不是公共字段,因為可視化設計器在屬性瀏覽器中顯示屬性,而不顯示字段。屬性就像智能字段。屬性通常具有帶訪問函數(shù)的專用數(shù)據(jù)成員,在語法上屬性被作為類的字段進行訪問。(雖然屬性可以具有不同的訪問級別,但此處的討論將重點放在公共訪問這種更加常見的情況上。屬性定義通常由以下兩部分組成:1、專用數(shù)據(jù)成員的定義。c-sharp view plaincopy 1. private int number = 0; 2、使用屬性聲明語法對公共屬性進行的定義。c-sharp view pla

2、incopy 1. /該語法通過 get 和 set 訪問函數(shù)將專用數(shù)據(jù)成員和公共屬性關聯(lián)起來。 2. public int MyNumber 3. 4. get 5. 6. return number; 7. 8. set 9. 10. number = value; 11. 12. 雖然屬性定義中通常包含專用數(shù)據(jù)成員,但這不是必需的。get 訪問器不用訪問私有數(shù)據(jù)成員就可以返回值。get 方法返回系統(tǒng)時間的屬性就屬于這種情況。屬性啟用數(shù)據(jù)隱藏,訪問器方法隱藏屬性的實現(xiàn)。定義屬性時需考慮以下重要的注意事項:1、 必須將屬性應用于定義的屬性。屬性用來指定設計器顯示屬性的方式。2、 如果改變屬性

3、將影響控件的外觀顯示,請從 set 訪問器中調(diào)用 Invalidate 方法(從 Control 繼承該方法)。Invalidate 隨后調(diào)用 OnPaint 方法,該方法將重新繪制控件。為提高效率起見,對 Invalidate 的多次調(diào)用將產(chǎn)生對 OnPaint 的一次調(diào)用。3、 .NET Framework 類庫為常見數(shù)據(jù)類型(如整數(shù)、小數(shù)、布爾值和其他數(shù)據(jù))提供了類型轉(zhuǎn)換器。類型轉(zhuǎn)換器的目的通常是用來提供字符串到數(shù)值的轉(zhuǎn)換(從字符串數(shù)據(jù)轉(zhuǎn)換為其他數(shù)據(jù)類型)。常見數(shù)據(jù)類型與默認類型轉(zhuǎn)換器(將數(shù)值轉(zhuǎn)換為字符串,并將字符串轉(zhuǎn)換為相應數(shù)據(jù)類型)相關聯(lián)。如果定義了自定義(即,非標準)數(shù)據(jù)類型的屬性

4、,則應用的屬性必須將類型轉(zhuǎn)換器指定為與該屬性相關聯(lián)。還可以使用屬性使自定義 UI 類型編輯器與某個屬性相關聯(lián)。UI 類型編輯器提供了一個用來編輯屬性或數(shù)據(jù)類型的用戶界面。顏色選擇器是 UI 類型編輯器的一個示例。例:首先創(chuàng)建一個名為 DrawingMode 的簡單枚舉。c-sharp view plaincopy 1. public enum DrawingMode 2. 3. Happy = 0, 4. Sad = 1, 5. Angry = 2 6. 接著,向該控件添加 MyDrawingMode 屬性c-sharp view plaincopy 1. private DrawingMod

5、e myDrawingMode; 2. Browsable(true), Category("Appearance") 3. public DrawingMode MyDrawingMode 4. 5. get 6. 7. return myDrawingMode; 8. 9. set 10. 11. myDrawingMode = value; 12. SetColors(); 13. 14. 對 SetColors 方法的調(diào)用只是根據(jù) myDrawingMode 的值設置控件的 BackColor 和 ForeColor。向控件添加下面的代碼。c-sharp view

6、plaincopy 1. private void SetColors() 2. 3. switch (myDrawingMode) 4. 5. case DrawingMode.Happy: 6. this.BackColor = Color.Yellow; 7. this.ForeColor = Color.Green; 8. break; 9. case DrawingMode.Sad: 10. this.BackColor = Color.LightSlateGray; 11. this.ForeColor = Color.White; 12. break; 13. case Draw

7、ingMode.Angry: 14. this.BackColor = Color.Red; 15. this.ForeColor = Color.Teal; 16. break; 17. default: 18. this.BackColor = Color.Black; 19. this.ForeColor = Color.White; 20. break; 21. 22. 現(xiàn)在可以向控件的paint方法添加代碼,來繪制控件的樣式,也可以添加現(xiàn)有的控件來組合實現(xiàn)想要的功能(例子里面有)。c-sharp view plaincopy 1. private void UserControl1_

8、Paint(object sender, PaintEventArgs e) 2. 3. Graphics curG = e.Graphics; 4. Pen curPen = new Pen(Color.Black); 5. Rectangle curRect = new Rectangle(0, 0, Width - 2, Height - 3); 6. curG.DrawRectangle(curPen, curRect); 7. curG.DrawEllipse(curPen, curRect); 8. 事件(Event)事件是對象發(fā)送的消息,以發(fā)信號通知操作的發(fā)生。操作可能是由用戶交

9、互(例如鼠標單擊)引起的,也可能是由某些其他的程序邏輯觸發(fā)的。引發(fā)事件的對象稱為事件發(fā)送方。捕獲事件并對其作出響應的對象叫做事件接收方。在事件通信中,事件發(fā)送方類不知道哪個對象或方法將接收到(處理)它引發(fā)的事件。所需要的是在源和接收方之間存在一個媒介(或類似指針的機制)。.NET Framework 定義了一個特殊的類型(Delegate),該類型提供函數(shù)指針的功能。代理(delegate)delegate是C#中的一種類型,它實際上是一個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有一個簽名(signature),并且它只能持有與它的簽名相匹配的方法的引用。這樣,代

10、理就等效于一個類型安全函數(shù)指針或一個回調(diào)。它允許你傳遞一個類A的方法m給另一個類B的對象,使得類B的對象能夠調(diào)用這個方法m。但與函數(shù)指針相比,delegate有許多函數(shù)指針不具備的優(yōu)點。首先,函數(shù)指針只能指向靜態(tài)函數(shù),而delegate既可以引用靜態(tài)函數(shù),又可以引用非靜態(tài)成員函數(shù)。在引用非靜態(tài)成員函數(shù)時,delegate不但保存了對此函數(shù)入口指針的引用,而且還保存了調(diào)用此函數(shù)的類實例的引用。其次,與函數(shù)指針相比,delegate是面向?qū)ο?、類型安全、可靠的受控(managed)對象。也就是說,runtime能夠保證delegate指向一個有效的方法,你無須擔心delegate會指向無效地址或者

11、越界地址。實現(xiàn)一個delegate是很簡單的,通過以下3個步驟即可實現(xiàn)一個delegate:1 聲明一個delegate對象,它應當與你想要傳遞的方法具有相同的參數(shù)和返回值類型。2 創(chuàng)建delegate對象,并將你想要傳遞的函數(shù)作為參數(shù)傳入。3 在要實現(xiàn)異步調(diào)用的地方,通過上一步創(chuàng)建的對象來調(diào)用方法。c-sharp view plaincopy 1. public class MyDelegateTest 2. 3. / 步驟1,聲明delegate對象 4. public delegate void MyDelegate(string name); 5. / 這是我們欲傳遞的方法,它與MyD

12、elegate具有相同的參數(shù)和返回值類型 6. public static void MyDelegateFunc(string name) 7. 8. Console.WriteLine("Hello, 0", name); 9. 10. public static void Main () 11. 12. / 步驟2,創(chuàng)建delegate對象 13. MyDelegate md = new MyDelegate(MyDelegateTest.MyDelegateFunc); 14. / 步驟3,調(diào)用delegate 15. md("sam1111")

13、; 16. 17. C#中的事件處理實際上是一種具有特殊簽名的delegate,象下面這個樣子:c-sharp view plaincopy 1. public delegate void MyEventHandler(object sender, MyEventArgs e); 其中的兩個參數(shù),sender代表事件發(fā)送者,e是事件參數(shù)類。MyEventArgs類用來包含與事件相關的數(shù)據(jù),所有的事件參數(shù)類都必須從System.EventArgs類派生。當然,如果你的事件不含特別的參數(shù),那么可以直接用System.EventArgs類作為參數(shù)。結(jié)合delegate的實現(xiàn),我們可以將自定義事件的實

14、現(xiàn)歸結(jié)為以下幾步:1:定義delegate對象類型,它有兩個參數(shù),第一個參數(shù)是事件發(fā)送者對象,第二個參數(shù)是事件參數(shù)類對象。2:定義事件參數(shù)類,此類應當從System.EventArgs類派生。如果事件不帶參數(shù),這一步可以省略。3:定義事件處理方法,它應當與delegate對象具有相同的參數(shù)和返回值類型。4:用event關鍵字定義事件對象,它同時也是一個delegate對象。5:用+=操作符添加事件到事件隊列中(-=操作符能夠?qū)⑹录年犃兄袆h除)。6:在需要觸發(fā)事件的地方用調(diào)用delegate的方式寫事件觸發(fā)方法。一般來說,此方法應為protected訪問限制,既不能以public方式調(diào)用,但可

15、以被子類繼承。名字是可以是OnEventName。7:在適當?shù)牡胤秸{(diào)用事件觸發(fā)方法觸發(fā)事件。下面是一個例子,例子模仿容器和控件的模式,由控件觸發(fā)一個事件,在容器中捕捉并且進行處理。c-sharp view plaincopy 1. / 2. / 事件的觸發(fā)者 3. / 4. public class Control 5. 6. public delegate void SomeHandler(object sender, System.EventArgs e); 7. public event SomeHandler SomeEvent; 8. public Control() 9. 10.

16、/這里使用的delegate必須與事件中聲名的一致 11. this.SomeEvent += new SomeHandler(this.ProcessSomeEvent); 12. 13. public void RaiseSomeEvent() 14. 15. EventArgs e = new EventArgs(); 16. Console.Write("Please input 'a':"); 17. string s = Console.ReadLine(); 18. /在用戶輸入一個小a的情況下觸發(fā)事件,否則不觸發(fā) 19. if (s = &q

17、uot;a") 20. 21. SomeEvent(this, e); 22. 23. 24. /事件的觸發(fā)者自己對事件進行處理,這個方法的參數(shù)必須和代理中聲名的一致 25. private void ProcessSomeEvent(object sender, EventArgs e) 26. 27. Console.WriteLine("hello"); 28. 29. c-sharp view plaincopy 1. / 2. / 事件的接收和處理者 3. / 4. class Container 5. 6. private Control ctrl =

18、 new Control(); 7. public Container() 8. 9. /這里使用的delegate必須與事件中聲名的一致 10. ctrl.SomeEvent += new Control.SomeHandler(this.ResponseSomeEvent); 11. ctrl.RaiseSomeEvent(); 12. 13. public static void Main() 14. 15. Container pane = new Container(); 16. Console.ReadLine(); 17. 18. /這是事件的接受者對事件的響應 19. priv

19、ate void ResponseSomeEvent(object sender, EventArgs e) 20. 21. Console.WriteLine("Some event occur!"); 22. 23. c-sharp view plaincopy 1. /程序運行的結(jié)果如下: 2. please input 'a':a 3. hello 4. Some event occur! 而我們看到的工具箱上的每個控件都有自己的圖標,我們可以通過下面語句為自己制作的控件添加圖標。c-sharp view plaincopy 1. ToolboxBi

20、tmap("D:/Program Files/qq/AirDLIcon/1381love.ico") 2. public partial class UserControl1 : UserControl 3. . 即在控件類前面加上ToolboxBitmap屬性,屬性參數(shù)指向一個圖片的地址就可以了。再比如,我自己定義了一個屬性,如果不進行設置,是不會在屬性窗口顯示的,也就是我們在用控件的時候不能夠通過可視化的界面對其進行設置,想讓它在屬性窗口顯示,就要用Browsable屬性了,如下面的例子。c-sharp view plaincopy 1. public enum Dra

21、wingModeHappy = 0,Sad = 1,Angry = 2 2. private DrawingMode myDrawingMode; 3. Browsable(true) 4. public DrawingMode MyDrawingMode 5. 6. get 7. 8. return myDrawingMode; 9. 10. set 11. 12. myDrawingMode = value; 13. 14. 像這樣的屬性還可以組合使用,例如上面的例子,我在Browsable屬性后面再加上一個Category屬性,讓它的參數(shù)等于Appearance,這時我們自己定義的屬性就從屬性

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論