控件属性动作
控件應該定義屬性而不是公共字段,因為可視化設計器在屬性瀏覽器中顯示屬性,而不顯示字段。屬性就像智能字段。屬性通常具有帶訪問函數的專用數據成員,在語法上屬性被作為類的字段進行訪問。(雖然屬性可以具有不同的訪問級別,但此處的討論將重點放在公共訪問這種更加常見的情況上。
?
屬性定義通常由以下兩部分組成:
?
1、專用數據成員的定義。
[c-sharp] view plaincopyprint?private int number = 0;
?
2、使用屬性聲明語法對公共屬性進行的定義。
[c-sharp] view plaincopyprint?//該語法通過 get 和 set 訪問函數將專用數據成員和公共屬性關聯起來。 public int MyNumber { get { return number; } set { number = value; } }
?
?
雖然屬性定義中通常包含專用數據成員,但這不是必需的。get 訪問器不用訪問私有數據成員就可以返回值。get 方法返回系統時間的屬性就屬于這種情況。屬性啟用數據隱藏,訪問器方法隱藏屬性的實現。
?
定義屬性時需考慮以下重要的注意事項:
?
1、?? 必須將屬性應用于定義的屬性。屬性用來指定設計器顯示屬性的方式。
2、?? 如果改變屬性將影響控件的外觀顯示,請從 set 訪問器中調用 Invalidate 方法(從 Control 繼承該方法)。Invalidate 隨后調用 OnPaint 方法,該方法將重新繪制控件。為提高效率起見,對 Invalidate 的多次調用將產生對 OnPaint 的一次調用。
3、?? .NET Framework 類庫為常見數據類型(如整數、小數、布爾值和其他數據)提供了類型轉換器。類型轉換器的目的通常是用來提供字符串到數值的轉換(從字符串數據轉換為其他數據類型)。常見數據類型與默認類型轉換器(將數值轉換為字符串,并將字符串轉換為相應數據類型)相關聯。如果定義了自定義(即,非標準)數據類型的屬性,則應用的屬性必須將類型轉換器指定為與該屬性相關聯。還可以使用屬性使自定義 UI 類型編輯器與某個屬性相關聯。UI 類型編輯器提供了一個用來編輯屬性或數據類型的用戶界面。顏色選擇器是 UI 類型編輯器的一個示例。
?
例:首先創建一個名為 DrawingMode 的簡單枚舉。
[c-sharp] view plaincopyprint?public enum DrawingMode { Happy = 0, Sad = 1, Angry = 2 }
?
接著,向該控件添加 MyDrawingMode 屬性
[c-sharp] view plaincopyprint?private DrawingMode myDrawingMode; [Browsable(true), Category("Appearance")] public DrawingMode MyDrawingMode { get { return myDrawingMode; } set { myDrawingMode = value; SetColors(); } }
?
對 SetColors 方法的調用只是根據 myDrawingMode 的值設置控件的 BackColor 和 ForeColor。向控件添加下面的代碼。
[c-sharp] view plaincopyprint?private void SetColors() { switch (myDrawingMode) { case DrawingMode.Happy: this.BackColor = Color.Yellow; this.ForeColor = Color.Green; break; case DrawingMode.Sad: this.BackColor = Color.LightSlateGray; this.ForeColor = Color.White; break; case DrawingMode.Angry: this.BackColor = Color.Red; this.ForeColor = Color.Teal; break; default: this.BackColor = Color.Black; this.ForeColor = Color.White; break; } }
?
現在可以向控件的paint方法添加代碼,來繪制控件的樣式,也可以添加現有的控件來組合實現想要的功能(例子里面有)。
[c-sharp] view plaincopyprint?private void UserControl1_Paint(object sender, PaintEventArgs e) { Graphics curG = e.Graphics; Pen curPen = new Pen(Color.Black); Rectangle curRect = new Rectangle(0, 0, Width - 2, Height - 3); curG.DrawRectangle(curPen, curRect); curG.DrawEllipse(curPen, curRect); }
?
?
?
?
?
?
事件(Event)
事件是對象發送的消息,以發信號通知操作的發生。操作可能是由用戶交互(例如鼠標單擊)引起的,也可能是由某些其他的程序邏輯觸發的。引發事件的對象稱為事件發送方。捕獲事件并對其作出響應的對象叫做事件接收方。
在事件通信中,事件發送方類不知道哪個對象或方法將接收到(處理)它引發的事件。所需要的是在源和接收方之間存在一個媒介(或類似指針的機制)。.NET Framework 定義了一個特殊的類型(Delegate),該類型提供函數指針的功能。
?
代理(delegate)
?
?
?
?
?
?
?
?
?
delegate是C#中的一種類型,它實際上是一個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有一個簽名(signature),并且它只能持有與它的簽名相匹配的方法的引用。這樣,代理就等效于一個類型安全函數指針或一個回調。它允許你傳遞一個類A的方法m給另一個類B的對象,使得類B的對象能夠調用這個方法m。但與函數指針相比,delegate有許多函數指針不具備的優點。首先,函數指針只能指向靜態函數,而delegate既可以引用靜態函數,又可以引用非靜態成員函數。在引用非靜態成員函數時,delegate不但保存了對此函數入口指針的引用,而且還保存了調用此函數的類實例的引用。其次,與函數指針相比,delegate是面向對象、類型安全、可靠的受控(managed)對象。也就是說,runtime能夠保證delegate指向一個有效的方法,你無須擔心delegate會指向無效地址或者越界地址。
?
實現一個delegate是很簡單的,通過以下3個步驟即可實現一個delegate:
?
1. 聲明一個delegate對象,它應當與你想要傳遞的方法具有相同的參數和返回值類型。
2. 創建delegate對象,并將你想要傳遞的函數作為參數傳入。
3. 在要實現異步調用的地方,通過上一步創建的對象來調用方法。
[c-sharp] view plaincopyprint?public class MyDelegateTest { // 步驟1,聲明delegate對象 public delegate void MyDelegate(string name); // 這是我們欲傳遞的方法,它與MyDelegate具有相同的參數和返回值類型 public static void MyDelegateFunc(string name) { Console.WriteLine("Hello, {0}", name); } public static void Main () { // 步驟2,創建delegate對象 MyDelegate md = new MyDelegate(MyDelegateTest.MyDelegateFunc); // 步驟3,調用delegate md("sam1111"); } }
?
?
C#中的事件處理實際上是一種具有特殊簽名的delegate,象下面這個樣子:
[c-sharp] view plaincopyprint?public delegate void MyEventHandler(object sender, MyEventArgs e);
?
其中的兩個參數,sender代表事件發送者,e是事件參數類。MyEventArgs類用來包含與事件相關的數據,所有的事件參數類都必須從System.EventArgs類派生。當然,如果你的事件不含特別的參數,那么可以直接用System.EventArgs類作為參數。
結合delegate的實現,我們可以將自定義事件的實現歸結為以下幾步:
?
1:定義delegate對象類型,它有兩個參數,第一個參數是事件發送者對象,第二個參數是事件參數類對象。
2:定義事件參數類,此類應當從System.EventArgs類派生。如果事件不帶參數,這一步可以省略。
3:定義事件處理方法,它應當與delegate對象具有相同的參數和返回值類型。
4:用event關鍵字定義事件對象,它同時也是一個delegate對象。
5:用+=操作符添加事件到事件隊列中(-=操作符能夠將事件從隊列中刪除)。
6:在需要觸發事件的地方用調用delegate的方式寫事件觸發方法。一般來說,此方法應為protected訪問限制,既不能以public方式調用,但可以被子類繼承。名字是可以是OnEventName。
7:在適當的地方調用事件觸發方法觸發事件。
?
下面是一個例子,例子模仿容器和控件的模式,由控件觸發一個事件,在容器中捕捉并且進行處理。
[c-sharp] view plaincopyprint?/// <summary> /// 事件的觸發者 /// </summary> public class Control { public delegate void SomeHandler(object sender, System.EventArgs e); public event SomeHandler SomeEvent; public Control() { //這里使用的delegate必須與事件中聲名的一致 this.SomeEvent += new SomeHandler(this.ProcessSomeEvent); } public void RaiseSomeEvent() { EventArgs e = new EventArgs(); Console.Write("Please input 'a':"); string s = Console.ReadLine(); //在用戶輸入一個小a的情況下觸發事件,否則不觸發 if (s == "a") { SomeEvent(this, e); } } //事件的觸發者自己對事件進行處理,這個方法的參數必須和代理中聲名的一致 private void ProcessSomeEvent(object sender, EventArgs e) { Console.WriteLine("hello"); } }
?
?
[c-sharp] view plaincopyprint?/// <summary> /// 事件的接收和處理者 /// </summary> class Container { private Control ctrl = new Control(); public Container() { //這里使用的delegate必須與事件中聲名的一致 ctrl.SomeEvent += new Control.SomeHandler(this.ResponseSomeEvent); ctrl.RaiseSomeEvent(); } public static void Main() { Container pane = new Container(); Console.ReadLine(); } //這是事件的接受者對事件的響應 private void ResponseSomeEvent(object sender, EventArgs e) { Console.WriteLine("Some event occur!"); } }
?
?
[c-sharp] view plaincopyprint?//程序運行的結果如下: please input 'a':a hello Some event occur!
?
?
?
?
?
而我們看到的工具箱上的每個控件都有自己的圖標,我們可以通過下面語句為自己制作的控件添加圖標。
[c-sharp] view plaincopyprint?[ToolboxBitmap(@"D:/Program Files/qq/AirDLIcon/1381love.ico")] public partial class UserControl1 : UserControl {………….}
?
即在控件類前面加上ToolboxBitmap屬性,屬性參數指向一個圖片的地址就可以了。
?
再比如,我自己定義了一個屬性,如果不進行設置,是不會在屬性窗口顯示的,也就是我們在用控件的時候不能夠通過可視化的界面對其進行設置,想讓它在屬性窗口顯示,就要用Browsable屬性了,如下面的例子。
[c-sharp] view plaincopyprint?public enum DrawingMode{Happy = 0,Sad = 1,Angry = 2} private DrawingMode myDrawingMode; [Browsable(true)] public DrawingMode MyDrawingMode { get { return myDrawingMode; } set { myDrawingMode = value; } }
?
?
像這樣的屬性還可以組合使用,例如上面的例子,我在Browsable屬性后面再加上一個Category屬性,讓它的參數等于Appearance,這時我們自己定義的屬性就從屬性框中的雜項轉到了外觀項里面了。
[c-sharp] view plaincopyprint?[Browsable(true), Category("Appearance")]
?
像這樣的屬性有很多,我主要羅列下面這些,在使用的時候大家可以參照。
?
Browsable
適用于屬性和事件,指定屬性或事件是否應該顯示在屬性瀏覽器中。
Category
適用于屬性和事件,指定類別的名稱,在該類別中將對屬性或事件進行分組。當使用了類別時,組件屬性和事件可以按邏輯分組顯示在屬性瀏覽器中。
Description
適用于屬性和事件,定義一小塊文本,該文本將在用戶選擇屬性或事件時顯示在屬性瀏覽器底部。
Bindable
適用于屬性 指定是否要綁定到該屬性。
DefaultProperty
適用于屬性,(將此特性插入類聲明前。)指定組件的默認屬性。當用戶單擊控件時,將在屬性瀏覽器中選定該屬性。
DefaultValue
適用于屬性,為屬性設置一個簡單的默認值。
Editor
適用于屬性,指定在可視設計器中編輯(更改)屬性時要使用的編輯器。
Localizable
適用于屬性,指定屬性可本地化。當用戶要本地化某個窗體時,任何具有該特性的屬性都將自動永久駐留到資源文件中。
DesignerSerializationVisibility
適用于屬性,指定顯示在屬性瀏覽器中的屬性是否應該(以及如何)永久駐留在代碼中。
TypeConverter
適用于屬性,指定將屬性的類型轉換為另一個數據類型時要使用的類型轉換器。
DefaultEvent
適用于事件,(將此特性插入類聲明前。)指定組件的默認事件。這是當用戶單擊組件時在屬性瀏覽器中選定的事件。
?
轉至http://blog.csdn.net/a237428367/article/details/5926445
轉載于:https://www.cnblogs.com/q280352958/archive/2013/02/26/2933099.html
總結
- 上一篇: 大漠插件最新版7.2107
- 下一篇: C语言递归练习