C#学习教程:Adefinedinabasicformcustomattributedefinedinabasicformtolooseitsstateininheritancewhenitare使用基本的我在处理不以继承形式维护状态的表单属性时遇到了麻烦。环境:这里是源代码和重现步骤:usingSystem;使用System.ComponentModel;使用System.Windows.Forms;namespaceTest{publicpartialclassBaseForm:Form{[DefaultValueAttribute(true)]publicboolControlVisible{get{returnthis.checkBox1.Visible;}设置{this.checkBox1.Visible=value;}}[DefaultValueAttribute(false)]publicboolControlChecked{get{returnthis.checkBox1.Checked;}设置{this.checkBox1.Checked=value;}}publicBaseForm(){InitializeComponent();}}}上面,默认属性匹配[DefaultValueAttribute],即在InitializeComponent()中,checkBox1.Visible设置为true,checkBox1.Checked为false。这些是放置在窗体上时控件的默认设置。然后我创建了一个具有以下继承的表单:usingSystem;使用System.ComponentModel;使用System.Windows.Forms;namespaceTest{publicpartialclassForm1:BaseForm{publicForm1(){InitializeComponent();}}}问题和重现步骤:当我在设计器中打开Form1时,属性处于以下状态。Status:ControlChecked=False-ControlVisible=True(Bold)ControlVisible按预期设置为True,但它是粗体。[DefaultValueAttribute]在基本形式中设置为true,因此我希望该属性不要以粗体显示。我现在在设计器中将ControlVisible更改为False。大胆的。状态:ControlChecked=False-ControlVisible=False我现在重建项目并重新生成Form1中的代码。ControlVisible属性以粗体形式恢复为True。状态:ControlChecked=False-ControlVisible=True(粗体)我现在已将ControlChecked从False更改为True,它按预期变为粗体。状态:ControlChecked=True(粗体)-ControlVisible=True(粗体)我重建了项目,但没有任何改变。状态:ControlChecked=True(粗体)-ControlVisible=True(粗体)我现在将ControlVisible的属性从True更改为False,然后再次重建项目。ControlVisible以粗体返回True。状态:ControlChecked=True(粗体)-ControlVisible=True(粗体)ControlChecked似乎按预期工作。当ControlVisible设置为false并且反转粗体时,它总是翻转回True。在我看来,[DefaultAttributeValue]在底层形式中是真的不被认可。更新:修订以修复错误并更准确地隔离问题。更新:如果我在BaseForm的构造函数中设置checkBox1.Visible=false,一切都会按预期进行。因此,最重要的是,问题似乎是DefaultValueAttribute在继承形式的自定义属性上被识别为true。您的checkBox1在基类中是私有的吗?如果不是那么它应该是,因为设计者将序列化两个设置器(一个用于checkBox1.Visible,另一个用于ControlVisible)并且只有序列化的顺序才能确定最终状态,这是不好的。另外,查看Form1.designer.cs文件中自动生成的InitializeControls方法,自定义属性是否明确设置为默认值?最后,尝试使用ShouldSerialze和Reset来查看是否有不同的行为。编辑我在本地重新创建了问题并附加了一个VS实例来调试另一个。VS第一次评估属性ControlVisible时,它??返回false,因为checkBox1.Visible(gettersource)为false。当实际的复选框控件被创建并显示时,属性窗口被滚动以显示ControlVisible它的值被再次评估,并返回true,这是默认值,但似乎VS内部已经标记了要修改的属性,如它的初始值与默认值不同。这可能是VS中的错误。我创建了一个简单的效果演示:publicBaseForm(){InitializeComponent();_testValue=假;}私有布尔_testValue;[DefaultValue(true)]publicboolTestProperty{get{return_testValue;}设置{_testValue=值;}}protectedoverridevoidOnVisibleChanged(EventArgse){_testValue=true;base.OnVisibleChanged(e);}}继承了上面的BaseForm,TestPropery的行为和例子中的ControlVisible一模一样,所以我认为这是VS的一个bug。您的问题的解决方案是使用一个简单的bool支持字段作为帮助程序,因为checkBox1.Visible是不可靠的:publicBaseForm(){InitializeComponent();checkBox1.Visible=_controlVisible=true;}私有布尔_controlVisible;[DefaultValue(true)]publicboolControlVisible{get{return_controlVisible;}设置{_controlVisible=checkBox1.Visible=值;您的ControlVisible属性始终设置为false:[DefaultValueAttribute(true)]publicboolControlVisible{get{returnthis.checkBox1.可见;}设置{this.checkBox1.Visible=false;你的set方法应该是:以上是C#学习教程:基本形式定义的自定义属性在重建时会失去以继承形式共享的状态如果对你有用还需要了解更多关于C#学习教程,希望大家多多关注——this.checkBox1.Visible=value;本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理会员删除。如需转载请注明出处:
