首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WinForm 控件開發總結(四):控件屬性序列化與 DesignerSerializationVisibilityAttribute 詳解

     編輯:關於.NET

前言:設計時屬性的關鍵角色

前文介紹了常用設計時屬性(Browsable、Category、Description 等),雖然簡單但對使用者體驗至關重要。本文重點深入兩個進階屬性:DesignerSerializationVisibilityAttribute 與 TypeConverterAttribute。

DesignerSerializationVisibilityAttribute:控制屬性序列化行為

此屬性指示代碼生成器如何持久化屬性值,取值為枚舉 DesignerSerializationVisibility:

  • Content:為物件「內容」生成代碼(如集合的 Add 呼叫),而非物件本身。
  • Hidden:不生成任何代碼,屬性值不持久化。
  • Visible:為物件本身生成代碼(預設行為)。

實戰:讓集合屬性在源代碼中序列化

建立一個簡單的 MyListControl,包含整數集合屬性 Item:

public class MyListControl : Control {
    private List<Int32> _list = new List<Int32>();

    [Browsable(true)]
    public List<Int32> Item {
        get { return _list; }
        set { _list = value; }
    }
    // OnPaint 繪製邊框與列表項目...
}

預設情況下,設計器將集合內容序列化至資源檔(.resx):

this.myListControl1.Item = ((List<int>)(resources.GetObject("myListControl1.Item")));

修改為 Content 模式

[Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Int32> Item { ... }

重新建置、重新添加集合項目後,設計器生成代碼變為:

this.myListControl1.Item.Add(1);
this.myListControl1.Item.Add(2);
this.myListControl1.Item.Add(3);
this.myListControl1.Item.Add(6);
this.myListControl1.Item.Add(8);
this.myListControl1.Item.Add(9);

集合內容現直接以 Add 方法呼叫形式寫入 InitializeComponent,實現了源代碼級序列化。

TypeConverterAttribute:類型轉換器的核心入口

TypeConverterAttribute 為屬性指定轉換器,核心作用:

  • 將屬性值轉為字串(屬性瀏覽器顯示)
  • 將屬性值轉為源代碼(持久化,如 InstanceDescriptor)
  • 反向解析:字串/代碼 → 屬性值
  • 支援子屬性展開(可摺疊顯示巢狀屬性)

.NET 內建大量轉換器(ColorConverter、EnumConverter 等),自訂類型才需自行實作。

控件效果展示

MyListControl 執行畫面

屬性瀏覽器中 Item 顯示為 Collection,點擊可彈出集合編輯器:

集合編輯器介面

下一步預告

下一篇將詳細剖析 TypeConverterAttribute 與自訂類型轉換器的完整實作細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved