自定义组件之属性(Property)的性质(Attribute)介绍(四)

原创 2004年02月29日 13:23:00

二:UI属性编辑器(UITypeEditor

这里的属性编辑器的意思是能够实现上面提到的弹出对话框和下拉UI的形式。废话不说下面我们一一介绍。

1、  弹出对话框的形式

在本例中我使用了string类型的属性来显示版本的信息,大家可以随便的写各类的属性,这里只需要指定改属性的编辑器就可以了。

首先我们要建立一个string类型的属性,代码如下:

              private string _appVer="1.0";

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

              [CategoryAttribute("自定义编辑器"),

              DefaultValueAttribute("1.0"),

              DescriptionAttribute("版本信息"),

              ReadOnlyAttribute(true),

              EditorAttribute(typeof(AppVerConverter),typeof(System.Drawing.Design.UITypeEditor))]

              public string AppVer

              {

                     get {return this._appVer;}

                     set {this._appVer=value;}

              }

大家可能已经注意到了在这个属性之多出了一个性质EditorAttribute(typeof(AppVerConverter),typeof(System.Drawing.Design.UITypeEditor)),具体的意思大家可以参考MSDN我在这里就不用多说了,那么我们看看AppVerConverter这个类是怎么实现的就可以了。具体代码如下:

/// <summary>

       /// 自定义UI的属性编辑器(弹出消息)

       /// </summary>

       public class AppVerConverter:System.Drawing.Design.UITypeEditor

       {

              /// <summary>

              /// 覆盖此方法以返回编辑器的类型。

              /// </summary>

              public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)

              {

                     return System.Drawing.Design.UITypeEditorEditStyle.Modal;

              }

 

              /// <summary>

              /// 覆盖此方法以显示版本信息

              /// </summary>

              public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)

              {

                     System.Windows.Forms.MessageBox.Show("版本:1.0/n作者:张翔","版本信息");

                     return value;

              }

       }

这里需要说明的是我们的属性编辑器必须从System.Drawing.Design.UITypeEditor继承,要不然就不能显示UI了。UITypeEditorEditStyle方法的返回值决定了改属性编辑器的类型大家可以参考msdn我在这里就不多说了。编译之后就可以看到如下的画面了:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

2、  下拉UI的类型

下拉UI类型主要是提供给用户一个简单的界面来选择所要确定的属性,这种方式提供给用户非常友好的界面。下面的例子我们首先定义里一个Point类型的属性,在默认的情况下这种类型的属性是会以展开的形式来让用户编辑的。在这里我们扩展了他的功能,不仅仅能通过直接输入的方式来改变值,而且还可以下拉出来一个控件,用户可以在这个控件上根据鼠标的位置来确定具体的值。下面具体的代码:

private System.Drawing.Point _dropUI;

 

              [CategoryAttribute("自定义编辑器"),

              DefaultValueAttribute("1"),

              DescriptionAttribute("下拉可视控件"),

              ReadOnlyAttribute(false),

              EditorAttribute(typeof(DropEditor),typeof(System.Drawing.Design.UITypeEditor))]

              public System.Drawing.Point DropUI

              {

                     get { return this._dropUI;}

                     set { this._dropUI=value; }

              }

 

 

 

       public class DropEditor:System.Drawing.Design.UITypeEditor

       {

 

              public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)

              {

                     return System.Drawing.Design.UITypeEditorEditStyle.DropDown;

              }

 

              public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)

              {

                     System.Windows.Forms.Design.IWindowsFormsEditorService iws=(System.Windows.Forms.Design.IWindowsFormsEditorService)provider.GetService(typeof(System.Windows.Forms.Design.IWindowsFormsEditorService));

                     if (iws!=null)

                     {

                            PropertyGridApp.DropUIControl UIControl=new PropertyGridApp.DropUIControl((System.Drawing.Point)value,iws);

                            iws.DropDownControl(UIControl);

                            return UIControl.Value;

                     }

                     return value;

              }

       }

      

       internal class DropUIControl:System.Windows.Forms.UserControl

       {

              public DropUIControl(System.Drawing.Point avalue,System.Windows.Forms.Design.IWindowsFormsEditorService iws)

              {

                     this.Value=avalue;

                     this._tmpvalue=avalue;

                     this._iws=iws;

                     this.SetStyle(System.Windows.Forms.ControlStyles.DoubleBuffer|System.Windows.Forms.ControlStyles.UserPaint|System.Windows.Forms.ControlStyles.AllPaintingInWmPaint,true);

                     this.BackColor=System.Drawing.SystemColors.Control;

              }

 

              private System.Drawing.Point _value;

              public System.Drawing.Point Value

              {

                     get { return this._value;}

                     set { this._value=value; }

              }

 

              private System.Drawing.Point _tmpvalue;

              private System.Windows.Forms.Design.IWindowsFormsEditorService _iws;

 

              protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)

              {

                     string str="X:"+this._tmpvalue.X.ToString()+"  ;Y:"+this._tmpvalue.Y.ToString();

                     System.Drawing.Graphics g=e.Graphics;

                     System.Drawing.SizeF sizef= g.MeasureString(str,this.Font);

                     g.DrawString(str,

                                     this.Font,

                                     new System.Drawing.SolidBrush(System.Drawing.Color.Black),

                                     (int)((this.Width-(int)sizef.Width)/2),

                                     this.Height-(int)sizef.Height);

                     g.PageUnit=System.Drawing.GraphicsUnit.Pixel;

                     g.FillEllipse(new System.Drawing.SolidBrush(System.Drawing.Color.Red),

                                      this.Value.X-2,

                                      this.Value.Y-2,

                                      4,

                                      4);

              }

 

              protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e)

              {

                     base.OnMouseMove(e);

                     this._tmpvalue=new System.Drawing.Point(e.X,e.Y);

                     this.Invalidate();

              }

 

              protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)

              {

                     base.OnMouseUp(e);

                     this.Value=this._tmpvalue;

                     this.Invalidate();

                     if (e.Button==System.Windows.Forms.MouseButtons.Left)

                            this._iws.CloseDropDown();

 

              }

       }

 

以上的代码度非常的简单,相信大家一定能够看懂,如果有不明白的地方看看帮助,那里面解释的非常的清楚。

在编写属性编辑器中我们都需要覆盖其中的EditValue这个方法,大家是否注意到了其中的object Value这个参数?其实这个参数就是已经装箱的属性值,在我们自定义的处理完这个值的时候同样可以返回一个装箱的值来确定已经修改的属性。在上面的两个例子中我们只是简单的使用了这个值,大家理解这个内容之后就可以做出更加个性化的编辑器了。

尾声:

.Net FrameWork中还有许多的Attribute,由于小弟知道的有限,所以只能给大家介绍这些,而且在这期间也避免不了有错误的地方希望大家能够原谅。小弟在此仅希望能够起到一个抛砖引玉的作用我就能够满足了,小弟非常感谢各位能够看完我写的这些东西。谢谢大家。

希望大家常联系:

E-mail:<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />kilxy@hotmail.com

QQ:20954664

Unity Editor 基础篇(七):Property Attributes自定义属性

本文参自:http://mp.weixin.qq.com/s/kjoS2DaAADBUPMg1kHwnSg 本文为本人学习上连接的笔记有改动,请点击以上链接查看原文,尊重楼主知识产权。Propert...
  • qq_33337811
  • qq_33337811
  • 2017年03月26日 15:03
  • 2141

Vue 常用API整理 1 - 组件属性与方法

Vue 常用 API 整理 1 - 组件属性与方法1. 单文件组件说明 .vue 文件是一个自定义的文件类型,用类HTML语法描述一个Vue组件。每个 .vue 文件包含三种类型的顶级语言块 ...
  • mjzhang1993
  • mjzhang1993
  • 2017年10月19日 17:00
  • 456

DOM之属性(attribute)和自定义对象属性(property)

DOM节点有一些属性和对象属性. 有时候我们会把他们搞混淆, 因为他们是相关联的, 但是他们真的是两个不同的东西. 特性 DOM节点是一个对象. 因此它可以存储自定义的对象属性和方法,就像...
  • qq_30325409
  • qq_30325409
  • 2016年04月15日 16:24
  • 306

Python进阶之“属性(property)”详解

来源:http://python.jobbole.com/80955/ Python中有一个被称为属性函数(property)的小概念,它可以做一些有用的事情。在这篇文章中,我们将看到如何能做以下几点...
  • freeking101
  • freeking101
  • 2016年09月12日 10:28
  • 3678

android 自定义控件属性

android 自定义控件属性
  • coderinchina
  • coderinchina
  • 2016年05月10日 16:06
  • 1768

Android 自定义属性(Attribute)详解

前言 定义属性Attribute资源 实例 定义XML属性资源 自定义ImageView类 使用 MainActivity代码前言Android本身给我们提供了很多的属性,像我们经常要用到的:andr...
  • Airsaid
  • Airsaid
  • 2016年05月15日 17:23
  • 1404

EBS OAF开发中属性集(Attribute Set)的介绍和手工实现

EBS OAF开发中属性集(Attribute Set)的介绍和手工实现(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究)在OAF开发中就和For...
  • tavor
  • tavor
  • 2014年01月13日 15:33
  • 2412

html 中的属性(property)以及DOM对象中的attributes的详解

先来讲讲今天的主题: 探索property(也就是html的某些属性,比如input的value id这些自带属性)和attributes(html中能看到的所有属性,包括自定义属性)的差异 先来讲...
  • maoguiyou
  • maoguiyou
  • 2016年12月14日 19:17
  • 1354

Qt之自定义属性Q_PROPERTY

QT提供了一个成熟的属性系统,但是作为一个跨平台的且与编译器无关的库,qt不依赖于非标准的编译器功能例如 __property or [property]; QT的强大之处在于它可以支持任何标准的c...
  • u010780613
  • u010780613
  • 2015年12月23日 14:52
  • 4535

C# 中自定义Attribute值的获取与优化

C#自定义Attribute值的获取是开发中会经常用到的,一般我们的做法也就是用反射进行获取的,代码也不是很复杂。 1、首先有如下自定义的Attribute [AttributeUsage(A...
  • hegx2001
  • hegx2001
  • 2015年12月18日 15:46
  • 7217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义组件之属性(Property)的性质(Attribute)介绍(四)
举报原因:
原因补充:

(最多只允许输入30个字)