PropertyGrid—默认属性,默认事件,属性默认值

摘要:
零简介当PropertyGrid显示对象的属性和事件时,您可以设置其默认属性和事件,也就是说,当您选择对象时,哪个属性或事件是PropertyGrid中的焦点。为对象的属性提供默认值,使PropertyGrid在显示属性时更友好。I默认属性和默认事件PropertyGrid可以标识默认属性和事件。例如,在设计期间,双击表单框将跳转到表单的加载事件,因为表单的默认事件是

零.引言

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

一.默认属性和默认事件

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

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

    //控件
    [DefaultProperty("Angle")]
    [DefaultEvent("Test")]
    public class MyControl : System.Windows.Forms.UserControl
    {
        private double _angle = 90D;
        private Color _penColor = Color.Red;

        public delegate void TestDefaultEvent();
        public event TestDefaultEvent Test;

        [BrowsableAttribute(true)]
         public double Angle
        {
            get
            { return _angle; }
            set
            { _angle = value; }
        }

        [Browsable(true)]
        public Color PenColor
        {
            get
            {
                return _penColor;
            }
            set
            {
                _penColor = value;
                Invalidate();
            }
        }
        public MyControl()
        {
            
        }

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            e.Graphics.DrawString("The Angle is " + _angle, this.Font, new SolidBrush(this._penColor),0,0);
        }
}

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

二.属性的默认值

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

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

  

    //控件
    [DefaultProperty("Angle")]
    [DefaultEvent("Test")]
    public class MyControl : System.Windows.Forms.UserControl
    {
        private double _angle = 90D;
        private Color _penColor = Color.Red;

        public delegate void TestDefaultEvent();

        public event TestDefaultEvent Test;

        [BrowsableAttribute(true)]
        [DefaultValue(90D)]
        public double Angle
        {
            get
            { return _angle; }
            set
            { _angle = value; }
        }

        [Browsable(true)]
        public Color PenColor
        {
            get
            {
                return _penColor;
            }
            set
            {
                _penColor = value;
                Invalidate();
            }
        }

        public void ResetPenColor()
        {
            PenColor = Color.Red;
        }

        public bool ShouldSerializePenColor()
        {
            return PenColor != Color.Red;
        }


        public MyControl()
        {
            //this._angle = 90;
        }

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            e.Graphics.DrawString("The Angle is " + _angle, this.Font, new SolidBrush(this._penColor),0,0);
        }
    }

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

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

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

三.完整代码

  下面是完整的代码:  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Drawing;

namespace TestDefaultProperty
{
    //控件
    [DefaultProperty("Angle")]
    [DefaultEvent("Test")]
    public class MyControl : System.Windows.Forms.UserControl
    {
        private double _angle = 90D;
        private Color _penColor = Color.Red;

        public delegate void TestDefaultEvent();

        public event TestDefaultEvent Test;

        [BrowsableAttribute(true)]
        [DefaultValue(90D)]
        public double Angle
        {
            get
            { return _angle; }
            set
            { _angle = value; }
        }

        [Browsable(true)]
        public Color PenColor
        {
            get
            {
                return _penColor;
            }
            set
            {
                _penColor = value;
                Invalidate();
            }
        }

        public void ResetPenColor()
        {
            PenColor = Color.Red;
        }

        public bool ShouldSerializePenColor()
        {
            return PenColor != Color.Red;
        }

        public MyControl()
        {
            //this._angle = 90;
        }

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            e.Graphics.DrawString("The Angle is " + _angle, this.Font, new SolidBrush(this._penColor),0,0);
        }
    }
}

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

(原文)

免责声明:文章转载自《PropertyGrid—默认属性,默认事件,属性默认值》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【Lua】Lua中ipair和pair的区别ExtJS组件的xtype属性列表下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Windows 7集成IE11(离线安装包、补丁)

当Win7系统需要集成IE11时,我们需要提前输入六个补丁KB2731771、KB2786081、KB2834140、KB2670838、KB2729094、KB2533623332位★ 百度网盘64位★ 百度网盘。我们需要输入这六个补丁才能更改IE11。此外,我们还需要32位的IE11离线安装包★ 百度网盘64位★ 百度网盘。这六个补丁是安装IE11所必需...

IntelliJ IDEA(2017)安装和破解

IDEA全称IntelliJIDEA,是Java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具、JUnit、CVS整合、代码分析、创新的GUI设计等方面的功能可以说是超常的。用记事本打开分别在最下面一行增加一行:-javaagent:D:IDEAinJetbra...

十四、ES开启密码认证

所以我们需要为es head和kibana添加密码认证。4、 为kibana设置密码。1.为kibana配置证书。因为kibana和es之间的连接也需要证书加密通信。mkdir-p/etc/kibana/certscp/etc/selastic search/certs-*/etc/kibana/certs/2.授予kibana主要权限。权限必须为kiban...

CentOS7 复制文件夹和移动文件夹

CentOS7在Linux中复制、移动和删除文件的命令有:cp、mv、rm I。文件复制命令cp命令格式:cp[-adfilprsu]源文件(source)目标文件(destination)cp[option]source1source2source3…directory参数描述:-a:指存档,即复制所有目录-d:如果源文件是连接文件(linkfile...

解决ubuntu下字体模糊的问题

最近,在ubuntu下使用firefox时,字体总是有点模糊。我搜索了大部分字体,以找到解决问题的方法。据说,这个问题的原因是网站本身设置了字体,这些字体通常在Windows下设置,因此在Linux下字体看起来是虚拟的。对应的中文应该是:编辑=˃选项=˃内容=˃字体和颜色=˃允许网页选择自己的字体。...