知识大全 编写与.NET属性窗口交互的RAD组件(四)
Posted 属性
篇首语:知识是从刻苦劳动中得来的,任何成就都是刻苦劳动的结果。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 编写与.NET属性窗口交互的RAD组件(四)相关的知识,希望对你有一定的参考价值。
编写与.NET属性窗口交互的RAD组件(四) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
提供可交互的属性视图 当你在Visual C# NET中创建一个项目的时候 你可能会注意到属性窗口的工具栏上有一个像闪电的按钮 按下这个按钮属性窗口就会切换到事件视图 这样就可以来编辑事件处理了 属性窗口的视图来自 属性页(Property Tabs) 因此视图使用的最主要的类是PropertyTab 命名空间是System Windows Forms Design 一个属性页可以和一个特别的组件 设计文档关联起来 或者是可以使用的静态关联 和组件或文档关联起来的属性页在类上用PropertyTabAttribute特性来指定 这个特性指定要创建的Tab的类型 它在属性窗口上是否显示由PropertyTabAttribute的PropertyTabScope参数来指定 指定为Component范围的属性页的可见性由有PropertyTabAttribute特性的组件的可见性来决定 Document范围的属性页则可以在当前项目的设计中都可见 他的默认值是PropertyTabScope Component 举一个例子来说 看看 FunkyButton 项目 FunkyButton是一个扩展了PropertyTab的UserControl 而且可以让我们把控件定为不规则的多边形 图 FunkyButton 当前选择的属性页就是属性窗口从被选择的控件的属性中得到的 属性页因此就允许来操纵显示属性的不同集合 Events页就是像属性一样以某种方式来处理事件 在这个例子中 属性页就创建了表示控件顶点的属性 NET framework中的属性用PropertyDescriptor类来封装 PropertyDescriptor本身是一个抽象类 framework中由他派生的类提供了访问组件的开放属性的方法 不过 属性窗口是直接作用在PropertyDescriptor上 而不是直接作用在属性上 因此 我们就可以写自己的PropertyDescriptor来做一些特殊的工作 在这个例子里 我们就有一个属性表示控件的顶点数 另一个就表示每一个顶点 再次注意一下 我们在属性窗口上增加页并不相应的作用在其他对象上 当属性窗口向PropertyTab询问Properties的时候 它就调用GetProperties方法 对于我们的示例程序 这个方法就像下面的一样 public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context object ponent Attribute[] attrs) // our list of props // ArrayList propList = new ArrayList(); // add the property for our count of vertices // propList Add(new NumPointsPropertyDescriptor(this)); // add a property descriptor for each vertex // for (inti = ; i < ((FunkyButton)ponent) Points Count; i++) propList Add(new VertexPropertyDescriptor(this i)); // return the collection of PropertyDescriptors PropertyDescriptor[] props = (PropertyDescriptor[])propList ToArray(typeof(PropertyDescriptor)); return new PropertyDescriptorCollection(props); GetProperties仅仅是返回一些属性描述的集合 PropertyDescriptors是相当的简单 仔细查看这些代码以了解他们是怎么工作的 FunkyButton同时示例了下拉列表编辑器的实现 对于每一个点 我们不是简单的输入坐标的X和Y值 我们会图示FunkyButton的形状 而且可以用图形化的方法改变点的位置 这样设置的编辑样式更加地友好 图 图形化的点向量 由于订制的PropertyTab提供了属性 重载这个属性的编辑器也是很容易的 只要简单地重载PropertyDescriptor的GetEditor方法 然后返回订制组件的实例就可以了 public override object GetEditor(Type editorBaseType) // make sure we re looking for a UITypeEditor // if (editorBaseType == typeof(System Drawing Design UITypeEditor)) // create and return one of our editors // if (editor == null) editor = new PointUIEditor(owner target); return editor; return base GetEditor(editorBaseType); 设计编辑器同样简单 编辑器就是一个简单的UserControl 所以我们就可以像设计其他的windowsForms对象一样来做 图 Designing the editor 最后 当用户在属性窗口中点击下拉箭头时 我们的编辑器就可以将刚才创建UI编辑器弹出来了 PointUIEditor中的UITypeEditor EditValue重载后就可以实现了 public override object EditValue( ITypeDescriptorContext context IServiceProvider sp object value) // get the editor service IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)sp GetService(typeof(IWindowsFormsEditorService)); // create our UI if (ui == null) ui = new PointEditorControl(); // initialize the ui with the settings for this vertex ui SelectedPoint = (Point)value; ui EditorService = edSvc; ui Target = (FunkyButton)context Instance; // instruct the editor service to display the control as a // dropdown edSvc DropDownControl(ui); // return the updated value; return ui SelectedPoint; 我们同样可以使用它 在你自己的应用中可以拥有和IDE属性窗一样的特性 把System Windows Forms PropertyGrid的控件 添加到IDE中的ToolBox中 通过获取在ToolBox的Component标签里的PropertyGrid PropertyGrid和其他的控件工作是一样的 你可以anchor或者是Dock他 改变它的色彩等 下面的列表列出了PropertyGrid的一些有趣的属性 这些属性都可以在设计时设置 在运行时 可以操作PropertyGrid让他显示的你的对象 下面是显示一个button的例子 在这个例子中 PorpertyGrid的帮助和toolbox都被隐藏了 就像上面提到的 你可以设置他自己的属性 图 隐藏了toolbar和帮助信息的PropertyGrid 结论 NET framework和Visual Studio NET给属性窗口增加了相当多的功能 由于属性窗口是RAD的核心 这些特性可以在保持易用性的同时有很多的扩展 也因此在Visual Basic中用的很普遍 就像可以在我们的程序中使用PropertyGrid 我们可以把更多的时间放在如何写好程序上 从而简化我们的UI工作 下面的代码是我实现的关于PointF的类型转换 如果是自定义类型 构造方式完全一样 在重载时最关键的地方就是GetPropertys的实现 不能直接返回基类的方法 否则 子属性的值是修改不了的 必须返回TypeDescriptor的GetPropertys 至于为什么 请自行查阅MSDN上相关文章的介绍 #region PointF的转换类实现 /// <summary> /// PointF的转换类实现 /// </summary> internal sealed class PointFConverter : TypeConverter /// <summary> /// 重载TypeConverter的CanConvertFrom方法 /// </summary> /// <param name= context ></param> /// <param name= sourceType ></param> /// 要测试的目标类型 /// <returns></returns> public override bool CanConvertFrom(ITypeDescriptorContext context Type sourceType) if (sourceType == typeof(string)) //sourceType的类型是Type return true; return base CanConvertFrom(context sourceType); /// <summary> /// 重载TypeConverter的ConvertFrom方法 /// 定义从源类型到目标类型的转换算法 /// </summary> /// <param name= context ></param> /// <param name= culture ></param> /// 本地化参数 /// <param name= value ></param> /// 输入字串 /// <returns></returns> public override object ConvertFrom(ITypeDescriptorContext context CultureInfo culture object value) if (value is string) //value是类型实例 string[] v = ((string)value) Split(new char[] ); return new PointF cha138/Article/program/net/201311/12720相关参考
编写与.NET属性窗口交互的RAD组件(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 扩展
知识大全 ASP.NET入门教程 1.7.8 属性窗口[2]
ASP.NET入门教程1.7.8属性窗口[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb
知识大全 ASP.NET入门教程 1.7.8 属性窗口[1]
ASP.NET入门教程1.7.8属性窗口[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb
JavaScript实际应用:子窗口和父窗口交互 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
ASP讲座之十:自己动手编写组件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一组件编写速成—
知识大全 RAD Studio 2009通过Mono提供.NET应用跨平台开发
RADStudio2009通过Mono提供.NET应用跨平台开发 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起
知识大全 asp.net中的validaterequest属性与安全性
不知道大家之前有没有注意到这个属性这里我们来一起讨论一下这个属性的作用以及我们以后到底该怎样使用它! 我们先来了解一下这个属性:(注:本属性中是新增的!) 它所在的命名空间:SystemWeb
通过实例看VCL组件开发全过程(三) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 四组件属性编辑
KeyDown(按键)用于响应键盘中首次按下的键 KeyDown事件同样可以在如图所示的Form属性窗口中找到双击该项为其编写事件响应如下 privatevoidForm_KeyDown(ob
MouseHover(鼠标悬停)事件发生于鼠标悬停在窗体控件上一段时间之后 同样在如图所示的Form属性窗口找到MouseHover事件项双击该项进入该事件代码编辑文件Formcs并对其编写事件