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 }

  非常简单,只需要给类加上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     }

  这里有两个属性,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 }

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

时间: 2024-10-27 07:53:11

PropertyGrid—默认属性,默认事件,属性默认值的相关文章

HTML 5 全局属性和事件属性

1.HTML 5 全局属性 HTML 属性能够赋予元素含义和语境. 下面的全局属性可用于任何 HTML5 元素. NEW:HTML 5 中新的全局属性. 属性 描述 accesskey 规定访问元素的键盘快捷键 class 规定元素的类名(用于规定样式表中的类). contenteditable 规定是否允许用户编辑内容. contextmenu 规定元素的上下文菜单. dir 规定元素中内容的文本方向. draggable 规定是否允许用户拖动元素. dropzone 规定当被拖动的项目/数据

HTML 全局属性 全局事件属性

HTML属性赋予元素意义和语境. 下面的全局属性可用于任何HTML元素. HTML全局属性 属性 -- 描述 accesskey: 规定激活元素的快捷键. class: 规定元素的一个或多个类名(引用样式表中的类). dir: 规定元素中内容的文本方向. id: 规定元素的唯一id. lang: 规定元素内容的语言. style: 规定元素的行内css样式. tabindex: 规定元素的tab键次序. title: 规定有关元素的额外信息. ==========================

delphi控件属性和事件

常用[属性] Action:该属性是与组件关联的行为,允许应用程序集中响应用户命令 Anchors:与组件连接的窗体的位置点 Align:确定组件的对齐方式 AutoSize:确定组件是否自动调整其大小 BiDiMode:(所有组件) 为从右向左写的语言提供支持 BoundsRect:定义组件边框矩形(只适用于运行时) Borderwidth:(窗口化组件)边框的宽度 BorberStyle:设置组件边框形状(样式) Brush:可确定组件的风格和颜色 Caption:使用该属性可指定标注组件的

[转]Delphi 控件属性和事件

常用[属性] Action:该属性是与组件关联的行为,允许应用程序集中响应用户命令 Anchors:与组件连接的窗体的位置点 Align:确定组件的对齐方式 AutoSize:确定组件是否自动调整其大小 BiDiMode:(所有组件) 为从右向左写的语言提供支持 BoundsRect:定义组件边框矩形(只适用于运行时) Borderwidth:(窗口化组件)边框的宽度 BorberStyle:设置组件边框形状(样式) Brush:可确定组件的风格和颜色 Caption:使用该属性可指定标注组件的

HTML事件属性

HTML事件属性 窗口事件属性(Window Event Attributes) 由窗口触发该事件 (适用于 <body> 标签): 属性 值 描述 onafterprint(New) script 在打印文档之后运行脚本 onbeforeprint(New) script 在文档打印之前运行脚本 onbeforeonload(New) script 在文档加载之前运行脚本 onblur script 当窗口失去焦点时运行脚本 onerror(New) script 当错误发生时运行脚本 on

CSS initial 关键字,用于设置 CSS 属性为它的默认值

CSS initial 关键字 实例 设置 <div> 元素内的文本颜色为红色,但是为 <h1> 元素保持最初的颜色: div {color: red; }h1 {color: initial; } 浏览器支持 除了 Internet Explorer,其他的主流浏览器都支持 initial 关键字. Opera 15 之前的版本不支持 initial 关键字. 定义和用法 initial 关键字用于设置 CSS 属性为它的默认值. initial 关键字可用于任何 HTML 元素

【有意思的BUG】默认置灰的属性的值传递

数据由Client发送给Server,如下图所示,Server在收到请求后会响应Client. 比如Client发送给Server一组数据:Name:sean&Hobby:movies&City:Peking&Country:China 有如下表单: 可以看到"China"是默认置灰的属性的值,不允许手动输入,所以用户只需要填写"Name"."Hobby"."City"这三项,然后点击最下面的"

LDAP过滤器使用说明(用户、组和容器的默认 LDAP 过滤器和属性)

说明来源:http://docs.oracle.com/html/E35191_01/ldap-filters-attrs-users.html#ldap-filters-attributes-users-default 用户.组和容器的默认 LDAP 过滤器和属性 下表包含用户.组和容器的默认 LDAP 过滤器和属性. Oracle VDI Manager 名称 默认值 用户过滤器 (&(|(objectclass=user)(objectclass=person)(objectclass=i

Struts2理解--动态方法和method属性及通配符_默认Action

众所周知,默认条件下,在浏览器输入indexAction!execute.action,便会执行indexAction类里的execute方法,这样虽然方便,但可能带来安全隐患,通过url可以执行Action中的任意方法. 想要禁止调用动态方法,则要在struts.xml中通过constant元素将属性strutsenableDynamicMethodInvocation设置为false,来禁止调用动态方法. <constant name="strutsenableDynamicMetho

[BS-16] 尽量将View的Opaque属性设置为YES(默认就是YES)

尽量将View的Opaque属性设置为YES(默认就是YES) UIView控件都有一个Opaque属性,如果不会更改view的透明度,那么应该将其opaque属性设置为YES.为什么要这样做呢?其实是有一定的原因的,一起来看一下.这样设置ios可以让系统以最优的方式来绘制view.opaque属性可以在Interface Builder或代码中设置. 苹果的官方文档对opaque属性有如下解释: This property provides a hint to the drawing syst