13

我有一个使用以下属性的具有公共属性的 UserControl:

[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

我已经尝试删除所有者表单,在 Visual Studio 2010 中重新创建一个新表单,然后将此 UserControl 添加到表单中。它不断在 Designer 文件中添加如下一行:

this.vMyUserControl.MyProperty = ((MyNamespace.MyClass)(resources.GetObject("vMyUserControl.MyProperty")));

这会使我的应用程序崩溃,因为此属性并非旨在通过序列化创建。

4

4 回答 4

13

在设计时将属性设为只读将防止它被序列化到 resx 文件中。奇怪的是,如果 MyType 碰巧是一个集合,则设计器会忽略只读,即使该属性未写入 resx,您仍然可以在设计时设置该属性,因此最好使该属性也不可浏览。

[ReadOnly(true)]
[Browsable(false)]
public MyType MyProperty
{
    get { return _MyProperty; }
    set { _MyProperty = value; }
}
于 2013-10-21T05:13:25.220 回答
5

采用[DesignerSerializationVisibilityAttribute ( Visibility = Hidden )]

MSDN 文章

于 2011-10-16T09:10:24.897 回答
2

尝试使用带有属性访问器方法的私有字段以及 [field: NonSerialized] 属性:

[field: NonSerialized]
private MyType _MyProperty;

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public MyType MyProperty
{
    get
    {
        return _MyProperty;
    }
    set
    {
        _MyProperty = value;
    }
}
于 2011-10-17T21:37:05.920 回答
1

我没有找到一个真正的解决方案,而是一个解决方法......

我必须进入 Form.resx 文件并找到它正在反序列化到我的公共属性中的数据/值键对。我手动删除了 XML 对的内容,然后我就可以运行应用程序了。

这使我的应用程序可以毫无错误地构建和运行。我尝试的所有其他方法(包括删除我的 UserControl 的容器表单并重复重新创建它)都不起作用。

于 2011-10-17T20:34:48.350 回答