2011-04-13 185 views
2

我与自定义属性的用户控制,如下所示:用户控制的定制属性丢失状态时用户控制重建

[DefaultValue(true)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
[Description("Gets or sets whether the \"Remove\" button is visible.")] 
public bool ShowRemoveButton 
{ 
    get 
    { 
     return this.removeButton.Visible; 
    } 
    set 
    { 
     this.removeButton.Visible = value; 
    } 
} 

控制包含一个标准按钮控制。该属性用于显示或隐藏按钮。用户控件内置在一个单独的项目组件中。我把它放在一个表单上,我可以设置和取消设置上述属性,并且一切看起来都可以正常工作。但是,当包含用户控件的项目被重建时,属性值会翻转为“false”,这不是默认值。

如何防止自定义属性丢失/改变控件重建时的状态?

回答

3

问题是,DefaultValueAttribute只告诉设计师属性的默认值是什么。它控制是否以加粗显示显示属性,以及右键单击属性并从上下文菜单中选择“重置”时重置的值。

它是什么不是 do是在运行时将属性设置为特定值。为此,您需要在您的用户控件的构造方法中放置代码。例如:

// set default visibility 
this.removeButton.Visible = true; 

否则,如您所述,重建项目时,属性的值将被重置。它将在设计器的“属性”窗口中显示为加粗,因为它与默认值(如DefaultValueAttribute中指定的)不匹配,但该属性不会更改设置的值。

+0

我尝试了上面,并设置“this.removeButton.Visible =真”在用户控件的构造函数。最初它似乎保持其状态。没有改变的重建不会改变属性值。但是,当我对用户控件进行了更改并重新构建时,该属性又切换为“false”并变得粗体。这很烦人。 – Elan 2011-04-13 15:01:30

+0

@Elan:然后你的代码中必须有一些东西在改变它的值。我创建了一些可重用的控件库和用户控件,但我从来没有遇到过这个问题。在代码中进行搜索以查看是否有任何设置'removeButton.Visible'属性。它可能隐藏在'* .Designer.cs'文件中,它被自动插入并且看不到它。 – 2011-04-14 05:00:45

+0

用户控件在构造函数中将属性设置为“true”。主窗体的designer.cs是将“ShowRemoveButton”属性生成为false的代码。这是唯一的两个地方。我在用户控件的属性声明中删除了[DefaultValue(true)]属性,希望将主窗体上的属性设置为“true”会导致值停滞。然而,当designer.cs类被重新生成并被替换为“false”时,属性值“true”会丢失。我无法获得“真实”的价值。这发生在一些表单设计者更改和重建之后。 – Elan 2011-04-14 16:12:06

2

一个简单的方法来保持任何包含从被在相关属性的(反)序列复位控件的属性是使用私人支持字段的属性和分配的DefaultValue属性的参数相匹配的默认值。在这种情况下,这是下面的_showRemoveButton = true声明/分配。

[DefaultValue(true)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
[Description("Gets or sets whether the \"Remove\" button is visible.")] 
public bool ShowRemoveButton 
{ 
    get 
    { 
     return _showRemoveButton; 
    } 
    set 
    { 
     _showRemoveButton = value; 
     this.removeButton.Visible = value; 
    } 
} 
private bool _showRemoveButton = true;