2

考虑一个具有属性 Rows 的自定义控件:

private EMRow[] _rows;

public CustControl()
{
    InitializeComponent();
}

public EMRow[] Rows
{
    get
    {
        return _rows;
    }
    set
    {
        _rows = value;
    }
}

每个 EMRow 创建一个 TextBox 并公开两个属性,一个用于 Text,另一个用于控件本身:

private TextBox _txtValue;

public EMRow()
{
    if (_txtValue == null)
        _txtValue = new TextBox();
}

public string Value
{
    get
    {
        return _txtValue.Text;
    }
    set
    {
        _txtValue.Text = value;
    }
}

public TextBox ValueTextBox
{
    get
    {
        return _txtValue;
    }
    set
    {
        _txtValue = value;
    }
}

如果将此自定义控件拖放到窗体上并修改 Value 属性,它会更新并保护对 Designer.cs 文件的更改。

当您深入研究 ValueTextBox 属性(同样,所有这些都在 Visual Studio 设计器中,而不是代码中)并修改属性时,更改不会保存到 Designer.cs 文件中。就设计者而言,甚至没有创建和引用此属性的 TextBox 对象。

我确信这是“预期的”行为,但我不知道为什么。我在这里错过了 VS 设计师的基础知识吗?

4

1 回答 1

1

经过一番挖掘,我找到了解决这个问题的方法,告诉设计者通过添加 DesignerSerializationVisibility 属性来序列化这个对象本身

private TextBox _txtValue;

public EMRow()
{
    if (_txtValue == null)
        _txtValue = new TextBox();
}

public string Value
{
    get
    {
        return _txtValue.Text;
    }
    set
    {
        _txtValue.Text = value;
    }
}

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public TextBox ValueTextBox
{
    get
    {
        return _txtValue;
    }
    set
    {
        _txtValue = value;
    }
}    

Winforms Designer:修改(并保留)子对象中的属性 感谢 Hans!

于 2012-11-15T13:55:05.110 回答