我們在做窗體應用程序開發中,通常需要通過以下界面,完成對象的動態修改,其簡單快捷的操作方式,大大提升了我們開發效率,如圖:
在當前原始控件無法滿足我們的要求的時候,我們通常需要自定義控件,為了提升控件的通用性,我們也希望這個控件可以通過以上屬性對話框進行動態修改。我們定義如下控件:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace AlbertControlExample.Controls { /// <summary> /// 定義一個新控件 /// </summary> public class AlbertControlDef : Control { public string Header { get; set; } = "標題"; public int Number { get; set; } = 100; public AlbertControlDef() { } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); } } }
將當前的對象拖到界面后,可以看到如下顯示:
除了來自父類的控件之外,定義了2個額外屬性,並且也定義了初始值,其實現如下,以上的顯示可以通過多個標簽進行配置,如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace AlbertControlExample.Controls { /// <summary> /// 定義一個新控件 /// </summary> public class AlbertControlDef : Control { [DisplayName("頭部")] [Description("頭部顯示控件")] [Category("特征")] [DefaultValue("默認值")] [Browsable(true)] public string Header { get; set; } = "標題"; [Category("特征")] [Browsable(false)] public int Number { get; set; } = 100; public AlbertControlDef() { } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); } } }
其主要顯示特征可以定義如下:
通過以上的定義,可以實現一些顯示屬性的定義,還有一些特殊類型,可以通過以上進行定義,其編寫如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace AlbertControlExample.Controls { /// <summary> /// 定義一個新控件 /// </summary> public class AlbertControlDef : Control { [DisplayName("頭部")] [Description("頭部顯示控件")] [Category("特征")] [DefaultValue("默認值")] [Browsable(true)] public string Header { get; set; } = "標題"; [Category("特征")] [Browsable(false)] public int Number { get; set; } = 100; [Category("特征")] public Color HeaderColor { get; set; } = Color.Coral; [Category("特征")] public Font headerFont { get; set; } = DefaultFont; public AlbertControlDef() { } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); } } }
通過定義一些常用的屬性之后,會發現窗體顯示界面,會自動給我們添加幾個關於這個屬性配置的操作界面,如圖
系統會自動給我們配置對應屬性需要的操作界面,這個系統是如何做到的呢,我們不得提一個重要的類TypeConverter,其是把我們輸入的信息,轉化為指定對象。如前面Number屬性,我們輸入的值是字符串,其會自動調用Int32Converter實現字符串和數字之間的互相轉換。我們常用的轉換類有:
提供用於在 16 位無符號整數對象與其他表示形式之間實現相互轉換的類型轉換器。 |
|
提供用於在 32 位無符號整數對象與其他各種表示形式之間實現相互轉換的類型轉換器。 |
|
提供用於在 64 位無符號整數對象與其他表示形式之間實現相互轉換的類型轉換器 |
|
提供將 Array 對象與其他各種表示形式相互轉換的類型轉換器。 |
|
ColorConverter |
將顏色從一種數據類型轉換為另一種數據類型 |
FontConverter |
將 Font 對象從一種數據類型轉換成另一種數據類型。 |
通過以上的TypeConverter實現PropertyGrid輸入的文字與對應的類型相互轉換。
下一節,我們介紹TypeConverter的使用。