[C#]自訂元件屬性設定Form

[C#]自訂元件屬性設定Form

我們一般在設計UserControl時都會幫這些UserControl開許多屬性以供彈性化設計,但我們如何做到像以下Font屬性,按下按鈕後會跳出一個字型設定畫面呢?

image image

以下簡單描述一下我們自訂的屬性如何實現以上的設定模式。

首先我們先new一個Class,用來實作我們所需要的UITypeEditor,程式碼如下,請注意我標示為****的部分,預計在按下屬性設定時會出現Form3:

01 using System;  
02 using System.Collections.Generic;  
03 using System.ComponentModel;  
04 using System.ComponentModel.Design;  
05 using System.Drawing;  
06 using System.Drawing.Design;  
07 using System.IO;  
08 using System.Text;  
09 using System.Windows.Forms;  
10 using System.Windows.Forms.Design;  
11 using CRMBOM;  
12
13 namespace CustomControlForm  
14 {  
15     /// <summary>  
16     /// 自訂跳出的屬性設定頁面  
17     /// </summary>  

18     public class MyTypeEditor : UITypeEditor  
19     {  
20         public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)  
21         {  
22             if (context == null || context.Instance == null)  
23                 return base.GetEditStyle(context);  
24             return UITypeEditorEditStyle.Modal;  
25         }
  
26
27         public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)  
28         {  
29             IWindowsFormsEditorService editorService;  
30
31             if (context == null || context.Instance == null || provider == null)  
32                 return value;  
33
34             try  
35             {  
36                 //取得Editor的服務  
37                 editorService = (IWindowsFormsEditorService)  
38                    provider.GetService(typeof(IWindowsFormsEditorService));  
39
40                 //***這邊呼叫您自己的Form***  
41                 Form3 tForm = new Form3();  
42                 using (tForm)  

43                 {  
44                     tForm.ShowDialog();  
45                 }
  
46
47                 return null;  
48
49             }
  
50             finally  
51             {  
52                 editorService = null;  
53             }
  
54         }
  
55     }
  
56 }

 

接著新增一個UserControl,多了一個屬性叫MyForm,而對這個屬性我們指定一些額外的屬性給它,重點在於指定了Editor為MyTypeEditor:

01 using System;  
02 using System.Collections.Generic;  
03 using System.ComponentModel;  
04 using System.Drawing;  
05 using System.Data;  
06 using System.Text;  
07 using System.Windows.Forms;  
08 using System.Drawing.Design;  

09
10 namespace CustomControlForm  
11 {  
12     public partial class UserControl1 : UserControl  
13     {  
14         public UserControl1()  
15         {  
16             InitializeComponent();  
17         }
  
18
19         //****這邊要指定Editor為MyTypeEditor  
20         [Editor(typeof(MyTypeEditor), typeof(UITypeEditor))]  
21         public string MyForm  
22         {  
23             get { return ""; }  
24             set { ; }  
25         }
  
26     }
  
27 }
 

建置完成後我們可以在工具箱看到我們剛剛新增的UserControl1:

image

將此元件拉到我們的Form1上:

image

然後在元件的屬性中找到MyForm,這時候可以看到MyForm這個屬性的後面確實有一個...的按鈕可以按:

image

按下去後會顯示我定義好的Form3,到此就大功告成囉。

image

參考資料一:http://winterdom.com/2006/08/acustomuitypeeditorforactivityproperties

參考資料二:深入剖析ASP.NET元件設計(http://findbook.tw/book/9789864215430/price)

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。