• 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中,在属性框中查看其属性。

    (原文)

  • 相关阅读:
    开网页自动进入路由器设置界面的解决办法(腾达路由器)
    SQL基本语句
    驱动调试配置
    【转】snort
    【转】snort.conf分析(中文)
    【转】snort 笔记2 ----- 规则编写
    【转】Snort语法规则说明及实例讲解
    【转】Snort 命令参数详解
    POST教程笔记
    POST教程笔记
  • 原文地址:https://www.cnblogs.com/code1992/p/10197035.html
Copyright © 2020-2023  润新知