星期日, 1月 17, 2021

[C#] DesignerSerializationVisibilityAttribute

根據官方文章
來了解 DesignerSerializationVisibilityAttribute 用途,[DesignerSerializationVisibilityAttribute 序列化] 簡易白話說明,就是屬性視窗內 Property 設定完後,會不會儲存在 Designer.cs (下圖)

[C#] DesignerSerializationVisibilityAttribute-1

 
類型說明
Hidden程式碼產生器產生物件內容的程式碼,而非物件本身的程式碼
Visible程式碼產生器會產生物件的程式碼
Content程式碼產生器產生物件內容的程式碼,而非物件本身的程式碼

DesignerSerializationVisibilityAttribute 預設為 DesignerSerializationVisibility.Visible

官方範例說明

建立 SerializationDemoControl 使用者自訂控件,並建立 Strings Property 
using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace UCSerialization
{
    public partial class SerializationDemoControl : UserControl
    {
        private string[] stringsValue = new string[1];

        // DesignerSerializationVisibility 為 "Content" 或 "Visible",將會序列化該屬性
        // 且該屬性可以在設計階段,透過 CollectionEditor 來進行編輯
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public string[] Strings
        {
            get
            {
                return this.stringsValue;
            }
            set
            {
                this.stringsValue = value;

                // 把 stringsValue 陣列資料,塞進 TextBox 內
                this.textBox1.Text = string.Join(Environment.NewLine, this.stringsValue);
            }
        }

        public SerializationDemoControl()
        {
            InitializeComponent();

            Padding = new Padding(10);

            textBox1.Multiline = true;
            textBox1.Dock = DockStyle.Fill;
            textBox1.ScrollBars = ScrollBars.Vertical;
            textBox1.ReadOnly = true;
        }
    }
}
把上述自訂控件拉進 Windows Form 內,並在自訂控件屬性視窗內編輯 Strings Property,就可以把輸入內容顯示在 TextBox 上

[C#] DesignerSerializationVisibilityAttribute-2

輸入完成後 Strings Property 的結果顯示

[C#] DesignerSerializationVisibilityAttribute-3

TextBox 上會顯示輸入文字

[C#] DesignerSerializationVisibilityAttribute-4

Designer.cs 內可以看見 Strings Property 的輸入值

[C#] DesignerSerializationVisibilityAttribute-5

可以嘗試把 DesignerSerializationVisibility 設定為 Hidde 來觀察,要注意 String Property 已經序列化過,轉成 Hidde 時 Designer.cs 不會自動刪除已經序列化的資料,要自行刪除才行

沒有留言:

張貼留言