考虑具有属性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设计师的基础吗?
答案 0 :(得分: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: Modify (and keep) properties in sub objects 谢谢汉斯!