日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

控件属性动作

發布時間:2023/12/10 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 控件属性动作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

控件應該定義屬性而不是公共字段,因為可視化設計器在屬性瀏覽器中顯示屬性,而不顯示字段。屬性就像智能字段。屬性通常具有帶訪問函數的專用數據成員,在語法上屬性被作為類的字段進行訪問。(雖然屬性可以具有不同的訪問級別,但此處的討論將重點放在公共訪問這種更加常見的情況上。

?

屬性定義通常由以下兩部分組成:

?

1、專用數據成員的定義。

[c-sharp] view plaincopyprint?
  • private int number = 0;?
  • private int number = 0;

    ?

    2、使用屬性聲明語法對公共屬性進行的定義。

    [c-sharp] view plaincopyprint?
  • //該語法通過 get 和 set 訪問函數將專用數據成員和公共屬性關聯起來。?
  • public int MyNumber??
  • ????? {?
  • ???? get??
  • ???????? {??
  • ?????????? return number;??
  • ??????? }?????
  • ???? set??
  • ???????? {??
  • ?????????? number = value;?
  • ??????? }?
  • ???? }?
  • //該語法通過 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?
  • ???????? }?
  • 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();?
  • ???????????? }?
  • ???????? }?
  • 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;?
  • ??????????? }?
  • ??????? }?
  • 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);?
  • ???????? }?
  • 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");??
  • ??? }??
  • }?
  • 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);?
  • 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");?
  • ???? }?
  • }?
  • /// <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!");?
  • ???? }?
  • }?
  • /// <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!?
  • //程序運行的結果如下: 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(@"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;?
  • ???????????? }?
  • ?? }?
  • 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(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

    總結

    以上是生活随笔為你收集整理的控件属性动作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。