我有一个UserControl的公共属性使用以下属性:
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
我试过删除所有者表单,在Visual Studio 2010中重新创建一个新表单,并将此UserControl添加到表单中。它一直在Designer文件中添加如下行:
this.vMyUserControl.MyProperty = ((MyNamespace.MyClass)(resources.GetObject("vMyUserControl.MyProperty")));
这会使我的应用程序崩溃,因为这个属性不是通过序列化来创建的。
在设计时将属性设置为只读将防止它被序列化到resx文件中。奇怪的是,如果MyType碰巧是一个集合,只读会被设计器忽略,你仍然可以在设计时设置该属性,即使该属性没有写入到resx中,所以最好也使该属性不可浏览。
[ReadOnly(true)]
[Browsable(false)]
public MyType MyProperty
{
get { return _MyProperty; }
set { _MyProperty = value; }
}
使用[DesignerSerializationVisibilityAttribute ( Visibility = Hidden )]
MSDN文章
尝试将私有字段与属性的访问方法以及[field: NonSerialized]属性一起使用:
[field: NonSerialized]
private MyType _MyProperty;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public MyType MyProperty
{
get
{
return _MyProperty;
}
set
{
_MyProperty = value;
}
}
我没能找到一个真正的解决方案,而是一个变通的方法…
我必须进入表单。Resx文件,并找到它反序列化到我的公共属性的数据/值密钥对。我手动删除了XML对内容,然后就可以运行应用程序了。
这允许我的应用程序构建和运行没有错误。我尝试的其他一切(包括删除我的UserControl的容器表单并反复重新创建它)都不起作用。