自定义组件之属性(Property)的性质(Attribute)介绍(四)
点击次数:18 次 发布日期:2008-11-26 23:57:50 作者:源代码网
|
源代码网推荐 源代码网推荐这里的属性编辑器的意思是能够实现上面提到的弹出对话框和下拉UI的形式。废话不说下面我们一一介绍。 源代码网推荐 源代码网推荐1、 弹出对话框的形式 源代码网推荐 源代码网推荐在本例中我使用了string类型的属性来显示版本的信息,大家可以随便的写各类的属性,这里只需要指定改属性的编辑器就可以了。 源代码网推荐 源代码网推荐首先我们要建立一个string类型的属性,代码如下: 源代码网推荐 源代码网推荐 private string _appVer="1.0"; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 [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 作者:张翔","版本信息"); 源代码网推荐 源代码网推荐 return value; 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐这里需要说明的是我们的属性编辑器必须从System.Drawing.Design.UITypeEditor继承,要不然就不能显示UI了。UITypeEditorEditStyle方法的返回值决定了改属性编辑器的类型大家可以参考msdn我在这里就不多说了。编译之后就可以看到如下的画面了: 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐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这个参数?其实这个参数就是已经装箱的属性值,在我们自定义的处理完这个值的时候同样可以返回一个装箱的值来确定已经修改的属性。在上面的两个例子中我们只是简单的使用了这个值,大家理解这个内容之后就可以做出更加个性化的编辑器了。 源代码网推荐 源代码网供稿. |
