繁体   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