Windows Form 架構中,有個視覺元件叫做Property Grid,她展現的Layout大概就是像設計工具中屬性頁的樣子,可以把物件中標定為Property的欄位顯示出來
這東西有著許多好處:
- 可以很快速地開發出反映一個Class中的Property的基本UI(在一些不重視視覺效果的應用領域奇方便,例如…自動化設備軟體(說溜嘴了?)
- 由於是反映Property,所以可在Property中限制參數的變動範圍,提供一種基本的、制式的使用者輸入防呆機制
- 搭配Type Convertor還有其他若干屬性設定後,可以以此為框架延伸出看來很有一致性的UI架構,而且只需要少量的程式碼
- 總體來說我覺得用在不需要很Fancy但講究開發效率的領域中非常的適合(就是在說自己的工作)
- 定義一個Class 裡面有若干個Property,並宣告一個Instance出來
- 拉入一個Property Grid到你的Form內,將SelectedObject指向剛剛宣告的Instance
- 執行,Property Grid會完全把Class內的Property給反映出來
其中有趣的是,Property Grid會自動限制輸入為變數可接受的型態,宣告為Integer你就不可能輸入abc、宣告為boolean選項就只會有true/false,若宣告為某種Enum,就會以ComboBox的形式提供有限個選項,選項會以Enum項目名稱顯示。
enum MyEnum
{
OPTION1,
OPTION2,
OPTION3,
}
class MyClass
{
public int Property1
{
get
{
return __innerVariableInteger;
}
set
{
// constrained range
if (value > 10 && value < 20)
__innerVariableInteger = value;
}
}
public string Property2
{
get
{
return __innerVariableString;
}
set
{
__innerVariableString = value;
}
}
public MyEnum Property3 { get; set; }
protected string __innerVariableString = "";
protected int __innerVariableInteger = 15;
}
|
若是型別為Enum則會自動提供ComboBox選項 |
如果我想限制參數1數值必須大於10小於20,只要在Property中的Set函式內寫一些拒絕輸入的機制,使用Property Grid的使用者就不可能突破此關卡,例如:
public int Property1
{
get
{
return __innerVariableInteger;
}
set
{
// constrained range
if (value > 10 && value < 20)
__innerVariableInteger = value;
}
}
你永遠沒辦法Key-in這範圍以外的值。
若是以最陽春的作法直接反映Property,可以注意到顯示出來的變數名稱都是以程式的宣告變數名為顯示,這樣是很難被使用者接受的(又有底線、名詞又不平實誰看得懂)
又或是某些Property並不想提供給使用者編輯,更甚者不想給人家看見
此時就要以Attribute描述的方式給予Property一些敘述,常用的敘述有:
- Browsable // 控制屬性是否可顯示在Grid上
- ReadOnly // 控制屬性是否可編輯
- DisplayName // 控制屬性顯示出來的名稱(就是用此標籤將艱澀的變數名轉譯成友善的敘述)
- Categrory // 控制屬性的分類,這可以做出折疊分類的效果
- Description // 控制屬性的描述,就是下面灰色的Bar會帶出的描述
加工一下MyClass:
class MyClass
{
[Description("The input value range is 16-19")] //offered the description which would showed on the bar below
[Category("Catagory A")] // offered the folded categoring method
[DisplayName("Integer Parameter")] // offered the customised display name
public int Property1
{
get
{
return __innerVariableInteger;
}
set
{
// constrained range
if (value > 10 && value < 20)
__innerVariableInteger = value;
}
}
[Browsable(false)] //wont be showed on PropertyGrid
public string Property2
{
get
{
return __innerVariableString;
}
set
{
__innerVariableString = value;
}
}
[DisplayName("想要選什麼?")] // much more human-readable?
public MyEnum Property3 { get; set; }
protected string __innerVariableString = "";
protected int __innerVariableInteger = 15;
}
|
- Property1顯示名稱改變嚕,而且有了分類
- Property2隱藏嚕
- Property3更讓人看得懂意義
|
咦,但是選項還是以程式語言的形式呈現阿?Boolean選項是true/false,怎麼就不能叫做 "是/否",Enum選項是英文,阿公阿罵哪看得懂,而且還帶了宅味在其中,這該怎麼去除呢?接著就要應用TypeConvertor,將選項做適當的轉譯,是退散宅味的好秘方,字字句句都可以成為很口語與詳實的描述。(之後再寫…)
後記:
一切的入手是從
這篇開始的,非常感謝
最近發現
這篇做了更多進階的介紹,讚
屬性化程式設計概念
關於TypeConvertor的MSDN原始說明