让Visual Studio设计器忽略公共属性

13

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

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

我尝试删除所有者表单,使用Visual Studio 2010重新创建一个新的表单,并将此UserControl添加到表单中。但是,在设计器文件中它仍然会添加类似以下行:

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

这会导致我的应用程序崩溃,因为该属性不是为序列化而设计的。

4个回答

13

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

[ReadOnly(true)]
[Browsable(false)]
public MyType MyProperty
{
    get { return _MyProperty; }
    set { _MyProperty = value; }
}

1
我只是想分享一下,我的同事推荐了这个解决方案,用于在查看WinForm设计器时避免Visual Studio崩溃。使用这些属性设置所有自定义公共属性,可以避免设计器导致VS崩溃。 - TheLegendaryCopyCoder
我希望这个属性存在于紧凑框架中。 :( - reirab
我在VS 2013 (VB)中必须使用完全限定名称:<System.ComponentModel.Browsable(False)> - Azura

5

使用 [DesignerSerializationVisibilityAttribute ( Visibility = Hidden )]

MSDN 文章


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

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public MyType MyProperty
{
    get
    {
        return _MyProperty;
    }
    set
    {
        _MyProperty = value;
    }
}

1

我没有找到真正的解决方案,只能用一个变通方法...

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

这使我的应用程序能够在没有错误的情况下构建和运行。我尝试过的其他所有方法(包括删除我的UserControl的容器表单并重复创建它)都没有起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接