VS自带的控件大多数据,属性都是有默认值的. 这是怎么实现的. (有人说: 给字段设个初始值呗!) 
      疑点一:  默认值与初始值是等同的吗? 好像是哦?
                     VS中的默认值与初始值是等同的吗? 不知道? (实际上是不等同的.)
    
      从MSDN上可以查到,简单属性与复杂属性的默认值设置又是不一样的.

如果属性不具有简单的默认值,则可以为属性提供可选方法 ShouldSerialize 和 Reset。如果属性 (Property) 具有简单的默认值,则应用 DefaultValueAttribute 并将默认值提供给属性 (Attribute) 类构造函数。上述机制中的任何一种都可以在设计器中启用下列功能:

  • 该属性在修改了其默认值的情况下,在属性浏览器中提供可视化表示。

  • 用户可以右键单击该属性并选择“重置”将该属性还原为其默认值。

  • 该设计器生成更为有效的代码。



属性的初始值与默认值不是一个概念, 大家可以很容易地看出来.
1, 初始值就是当控件第一次被拖到窗体上属性中的值. 对于简单的类型比如int类型, 初始值默认为0, 这是控件类被实例化时分配的.
2, 默认值是当属性值不为粗体时的那个值就是该属性的默认值.

来段代码先, (下面是综合了前几篇文章中所提及的代码) 只包含两个属性的控件,一个简单属性,一个简单属性
  1using System.ComponentModel;
  2using System.Windows.Forms;
  3using System.Drawing;
  4
  5namespace CustomControlSample
  6{
  7    public class CustomControl : Control
  8    {
  9        // 注意:这里设置了简单属性的初始值123
 10        private int simpleField = 123;
 11
 12        [Category("我是属性,我怕谁!")]
 13        [Description("我是属性,故我在(属性浏览器中)!")]
 14        [DefaultValue(456)] // 如果属性 (Property) 具有简单的默认值,则应用 DefaultValueAttribute
 15        public int SimpleProperty
 16        {
 17            get return simpleField; }
 18            set { simpleField = value; }
 19        }

 20
 21        // 注意:这里设置了复杂属性的初始值 new SimpleCustomType(1, 2)
 22        private SimpleCustomType complexField = new SimpleCustomType(12);
 23
 24        [Category("我是复杂的属性哦!")]
 25        [Description("我是简单的复杂属性,因为我是由简单的类型和简单的方式定义的。\n定义我的类型很简单,只有两个属性(Min, Max);定义我的body也很简单,只是简单的get, set.")]
 26        [TypeConverter(typeof(SimpleCustomTypeConverter))]
 27        public SimpleCustomType ComplexProperty
 28        {
 29            get return complexField; }
 30            set { complexField = value; }
 31        }

 32
 33        // 如果属性不具有简单的默认值,则可以为属性提供可选方法 ShouldSerialize 和 Reset。
 34        /// <summary>
 35        /// 设置复杂属性的默认值 new SimpleCustomType(8, 9)
 36        /// </summary>

 37        public void ResetComplexProperty()
 38        {
 39            ComplexProperty = new SimpleCustomType(89);
 40        }

 41
 42        /// <summary>
 43        /// 诸如 Visual Studio 之类的设计器可使用 ShouldSerializePropertyName 方法来检查属性是否已不再使用其默认值,
 44        /// 并仅在属性发生改变的情况下将代码写入到窗体中,从而更有效地生成代码。
 45        /// </summary>
 46        /// <returns></returns>

 47        public bool ShouldSerializeComplexProperty()
 48        {
 49            return (ComplexProperty.Min != 8 || ComplexProperty.Max != 9);
 50        }

 51
 52        protected override void OnPaint(PaintEventArgs e)
 53        {
 54            base.OnPaint(e);
 55            e.Graphics.DrawRectangle(Pens.Red, new Rectangle(Point.Empty, new Size(Width - 1, Height - 1)));
 56        }

 57    }

 58
 59    简单的自定义类型
 88
 89    简单的自定义类型的类型转换器
140}

141

强烈建议有需要的同学仔细阅读代码中的注释部分.并在本机上反复实践.

The end.

posted on 2007-03-14 16:22  Louis.Lu.Sz  阅读(2037)  评论(2编辑  收藏  举报