(承接此篇)
EditorAttibute
在該欄位點下"編輯"後,系統會找尋該欄位的是否有EditorAttribute,若有,則根據你指定的Editor型別配置(Allocate)一個新實例(Instance),並呼叫該實例的EditValue函式,最後將EditValue傳回的值Set回該Property
實作方式是宣告一Class,繼承UITypeEditor,並複寫(override)以下函式:
- GetEditStyle
- 傳回值型別為UITypeEditorEditStyle,傳回不同值可改變欄位編輯入口樣式
- Model:該欄位會提供(...)讓使用者點擊,通常要另外提供表單(Form)讓使用者操作
- DropDown:顧名思義是提供下拉式選單
- None:沒得編輯
- EditValue
- 就是Editor最主要的函式,函式執行完畢後傳回值即為編輯完成的值
- 慣用起手式:
- 另外配置(Allocate)一個表單(Form)
- 帶入(Controls.Add)自己的UserControl,i.e TextBox.Text
- 顯示該表單,通常使用ShowDialog,使EditValue被Block在此行
- 在使用者關閉表單後,ShowDialog返回
- 從剛剛的UserControl取得使用者輸入的值,i.e TextBox.Text
- 將輸入值傳回(Return)
class stringUIEditor : UITypeEditor { public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context) { return UITypeEditorEditStyle.Modal; } public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value) { Form __form = new Form(); // allocating a form , used to show-up editable facility TextBox __tb = new TextBox(); __form.Controls.Add(__tb); __form.AutoSize=true; __form.ShowDialog(); // show-up the form return __tb.Text; //return the text value the user just input. } }
註:EditValue的輸入引數有許多妙用,可以用來判斷呼叫對象的特性,若要打造比較萬能的Editor就得要深入了解
從(...)呼喚的UIEditor |
程式碼參考