簡體   English   中英

是否可以在設計器生成的代碼中設置自定義組件/控件的自定義屬性的序列化順序?

[英]Is it posible to set the order of the serialization of a custom property of a custom component/control in the designer-generated code?

我正在使用自定義屬性來處理一些自定義(繼承)控件,在適當的屬性修飾之后,我為此添加了設計時支持。

一切正常,但是我的問題是,使用控件的* .Designer.cs文件中的自動生成的代碼具有特定的順序,可以在其中設置各種屬性(基本屬性和新屬性)。 該順序看起來像是屬性名稱的字母順序。

因此,自動生成的代碼如下所示:

// 
// myTabPage1
// 
this.myTabPage1.Identifier = "ID";
this.myTabPage1.Name = "myTabPage1";
this.myTabPage1.Size = new System.Drawing.Size(294, 272);
this.myTabPage1.Text = "TTT";

我希望它看起來像這樣:

// 
// myTabPage1
// 
this.myTabPage1.Name = "myTabPage1";
this.myTabPage1.Size = new System.Drawing.Size(294, 272);
this.myTabPage1.Text = "TTT";
this.myTabPage1.Identifier = "ID";

我之所以需要這樣做,是因為設置Identifier屬性會影響Text ,然后將Text還原回其設計時值,從而取消設置Identifier的效果。

當然,有一些簡單的解決方法(最簡單的方法是不設置可以正常工作的Text屬性),但是如果這不是設計時的“煩惱”,那將是很好的,因為許多情況下都廣泛使用了這種設計模式繼承的控件類型及其實例。

設置Text以標識表單設計器上的控件也很有幫助( Identifier在設計時對Text沒有影響)。

不,您不能影響序列化順序。 否則,這是常規解決方案的常見問題,請實現ISupportInitialize接口 在設計人員開始分配屬性之前,將調用BeginInit()方法,通常會設置一個bool變量,以確保屬性設置器不會產生意外的副作用。 完成后,將調用EndInit()方法,並且所有屬性都有一個值,您可以將變量設置回false並執行使用值所需的所有操作。

您的問題對帶有問題的控件還不夠具體,但是可能的實現可能看起來像這樣:

public partial class CustomControl : UserControl, ISupportInitialize {
    public CustomControl() {
        InitializeComponent();
    }
    private bool initializing;
    private string id = "";

    public string ID {
        get { return id; }
        set { id = value;
              if (!initializing) label1.Text = value;
        }
    }
    [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public override string Text {
        get { return base.Text; }
        set {
            base.Text = value;
            if (!initializing && !this.DesignMode) label1.Text = value;
        }
    }

    public void BeginInit() {
        initializing = true;
    }

    public void EndInit() {
        initializing = false;
        label1.Text = ID;
    }
}

還要注意此代碼中的[DesignerSerializationVisibility]屬性,當您使用Hidden時,該屬性根本不會被序列化。 那可能是解決您的問題的簡單方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM