zoukankan      html  css  js  c++  java
  • PropertyGrid—默认属性,默认事件,属性默认值

    零.引言

      PropertyGrid显示一个对象的属性和事件时,可以设置其默认属性和事件,也就是当你选中对象时,propertyGrid中焦点在哪一个属性或事件上。为对象的属性提供默认值,使PropertyGrid显示属性时,更加友好。

    一.默认属性和默认事件

      PropertyGrid能识别默认属性和事件,例如在设计时,双击Form框,就会跳到Form的Load事件中,这是因为Form的默认事件是Load。当你选中属性框中的某一项后,该项会着色(蓝色)选中,在属性和事件选项卡之间切换,就会发现,选中的始终是默认的属性和事件(例如,Form,选中的就是Text属性和Load事件)。

      下面我们就来设计默认属性和事件,还是以MyControl为例。

      
     1     //控件
     2     [DefaultProperty("Angle")]
     3     [DefaultEvent("Test")]
     4     public class MyControl : System.Windows.Forms.UserControl
     5     {
     6         private double _angle = 90D;
     7         private Color _penColor = Color.Red;
     8 
     9         public delegate void TestDefaultEvent();
    10         public event TestDefaultEvent Test;
    11 
    12         [BrowsableAttribute(true)]
    13          public double Angle
    14         {
    15             get
    16             { return _angle; }
    17             set
    18             { _angle = value; }
    19         }
    20 
    21         [Browsable(true)]
    22         public Color PenColor
    23         {
    24             get
    25             {
    26                 return _penColor;
    27             }
    28             set
    29             {
    30                 _penColor = value;
    31                 Invalidate();
    32             }
    33         }
    34         public MyControl()
    35         {
    36             
    37         }
    38 
    39         protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    40         {
    41             e.Graphics.DrawString("The Angle is " + _angle, this.Font, new SolidBrush(this._penColor),0,0);
    42         }
    43 }
    View Code

      非常简单,只需要给类加上DefaultProperty和DefaultEvent特性,在特性中指明属性或事件名称即可。

    二.属性的默认值

      一般来说,属性都有一个默认值。我们经常看到,在PropertyGrid中,有些属性字体是没有加粗的,而有些却加粗,没加粗的是默认属性,修改后就会变粗,改为默认值后,又不加粗,这是为了方便开发人员设别哪些属性修改了的。

      如何达到这样的效果,需要给属性添加默认值。这里又分两种情况,对于基础类型(如int,float等)直接加上默认值特性即可,但对于一些复杂的属性,则要使用函数来设置,如下的例子:

      
     1     //控件
     2     [DefaultProperty("Angle")]
     3     [DefaultEvent("Test")]
     4     public class MyControl : System.Windows.Forms.UserControl
     5     {
     6         private double _angle = 90D;
     7         private Color _penColor = Color.Red;
     8 
     9         public delegate void TestDefaultEvent();
    10 
    11         public event TestDefaultEvent Test;
    12 
    13         [BrowsableAttribute(true)]
    14         [DefaultValue(90D)]
    15         public double Angle
    16         {
    17             get
    18             { return _angle; }
    19             set
    20             { _angle = value; }
    21         }
    22 
    23         [Browsable(true)]
    24         public Color PenColor
    25         {
    26             get
    27             {
    28                 return _penColor;
    29             }
    30             set
    31             {
    32                 _penColor = value;
    33                 Invalidate();
    34             }
    35         }
    36 
    37         public void ResetPenColor()
    38         {
    39             PenColor = Color.Red;
    40         }
    41 
    42         public bool ShouldSerializePenColor()
    43         {
    44             return PenColor != Color.Red;
    45         }
    46 
    47 
    48         public MyControl()
    49         {
    50             //this._angle = 90;
    51         }
    52 
    53         protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    54         {
    55             e.Graphics.DrawString("The Angle is " + _angle, this.Font, new SolidBrush(this._penColor),0,0);
    56         }
    57     }
    View Code

      这里有两个属性,Angle和PenColor,一个是简单数据类型,只需给他加上DefaultValue特性即可,但要注意默认值的后缀,必须使用类型相关的后缀,否则设置无效。

      一个Color类型的属性,我们无法使用上面的方式,否则编译错误。我们需要给他提供两个函数ResetPenColor和ShouldSerializePenColor,关键在于函数的取名,Reset + 属性名,ShouldSerialize + 属性名。ResetPenColor告诉设计器PenColor的默认值是什么,ShouldSerializePenColor告诉设计器,什么时候将属性进行设计时序列化,这里,我们让其值不为默认值时,进行序列化。

      需要注意的是,设置属性的默认值时,也要设置属性变量的初始值,当然,要与默认值相同。

    三.完整代码

      下面是完整的代码:

      
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.ComponentModel;
     6 using System.Drawing;
     7 
     8 namespace TestDefaultProperty
     9 {
    10     //控件
    11     [DefaultProperty("Angle")]
    12     [DefaultEvent("Test")]
    13     public class MyControl : System.Windows.Forms.UserControl
    14     {
    15         private double _angle = 90D;
    16         private Color _penColor = Color.Red;
    17 
    18         public delegate void TestDefaultEvent();
    19 
    20         public event TestDefaultEvent Test;
    21 
    22         [BrowsableAttribute(true)]
    23         [DefaultValue(90D)]
    24         public double Angle
    25         {
    26             get
    27             { return _angle; }
    28             set
    29             { _angle = value; }
    30         }
    31 
    32         [Browsable(true)]
    33         public Color PenColor
    34         {
    35             get
    36             {
    37                 return _penColor;
    38             }
    39             set
    40             {
    41                 _penColor = value;
    42                 Invalidate();
    43             }
    44         }
    45 
    46         public void ResetPenColor()
    47         {
    48             PenColor = Color.Red;
    49         }
    50 
    51         public bool ShouldSerializePenColor()
    52         {
    53             return PenColor != Color.Red;
    54         }
    55 
    56 
    57         public MyControl()
    58         {
    59             //this._angle = 90;
    60         }
    61 
    62         protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    63         {
    64             e.Graphics.DrawString("The Angle is " + _angle, this.Font, new SolidBrush(this._penColor),0,0);
    65         }
    66     }
    67 }
    View Code

      新建Windows工程,添加该代码,将MyControl控件拖入Form中,在属性框中查看其属性。

  • 相关阅读:
    【09-04】java内部类学习笔记
    【09-03】java泛型学习笔记
    【08-23】redis学习笔记
    【06-23】js动画学习笔记01
    【11-23】mysql学习笔记02
    【06-18】CentOS使用笔记
    thinkphp+datatables+ajax 大量数据服务器端查询
    python遗传算法实现数据拟合
    简单的新闻客户端APP开发(DCloud+thinkphp+scrapy)
    python游戏编程——跟13岁儿童学编程
  • 原文地址:https://www.cnblogs.com/yongyu/p/4231630.html
Copyright © 2011-2022 走看看