UITypeEditor 讓屬性在 PropertyGrid 中呈現自訂下拉介面或繪製預覽圖示(如 ColorPicker 的色塊、Dock 的圖示),大幅提升設計時體驗。
| 模式 | 方法 | 回傳/行為 | 範例 |
|---|---|---|---|
| 下拉編輯器 | EditValue | 回傳新屬性值 | ColorPicker、FontPicker、Dock |
| 繪製預覽 | PaintValue + GetPaintValueSupported | 在屬性格繪製圖示 | Color 色塊、BorderStyle 圖示 |
[Editor(typeof(CardTypesEditor), typeof(UITypeEditor))]
public class CardTypes { public CardType Value { get; set; } }
public class CardTypesEditor : UITypeEditor
{
public override bool GetPaintValueSupported(ITypeDescriptorContext context) => true;
public override void PaintValue(PaintValueEventArgs e)
{
string bmpName = null;
var card = (CardTypes)e.Value;
switch (card.Value)
{
case CardType.Hearts: bmpName = "Hearts.bmp"; break;
case CardType.Spades: bmpName = "Spades.bmp"; break;
case CardType.Diamonds: bmpName = "Diamonds.bmp"; break;
case CardType.Clubs: bmpName = "Clubs.bmp"; break;
}
if (bmpName != null)
{
using (var bmp = new Bitmap(typeof(CardTypesEditor), bmpName)) // 嵌入資源
{
e.Graphics.DrawImage(bmp, e.Bounds);
}
}
}
}
圖片需設為嵌入資源,尺寸 16x16,BMP 格式。
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
var edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
var control = new MyCustomDropDownControl((MyType)value);
edSvc.DropDownControl(control);
return control.SelectedValue;
}
public class MyControl : WebControl
{
[Editor(typeof(MyCustomEditor), typeof(UITypeEditor))]
public MyType MyProperty { get; set; }
}
TypeConverter 負責字串↔物件轉換、標準值列表(下拉文字清單)UITypeEditor 負責視覺化編輯介面[TypeConverter(typeof(MyConverter))] [Editor(typeof(MyEditor), typeof(UITypeEditor))]