欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VB.NET自定义设计器之属性编辑器自定义

程序员文章站 2022-07-13 14:33:31
...

属性编辑,正常来说不需要自定义,因为一般的属性,在里面都能支持,当要进行一个自定义类型的属性编辑时,就得进行属性编辑器的自定义了。
如何让自己的属性支持如VB.NET自定义设计器之属性编辑器自定义
有一个下拉框按钮呢。默认只支持内置的类型。假如想要进行自定义就是今天的内容了。
首先我们从Msdn中的得知,有一个UITypeEditor这个基类也是一个特性。
拥有它就能够进行属性的自定义了
1.建立一个自定义的class

  Public Class MyEditAttribute
     Inherits UITypeEditor
     
    End Class

然后重写四个方法,GetEditStyle、EditValue、PaintValue、GetPaintValueSupported。
接下来一一讲解

  1. GetEditStyle
    重写该方法以指定属性编辑右侧的小按钮是…还是下拉箭头。这里以下拉箭头为例也就是UITypeEditorEditStyle.DropDown
 Public Overrides Function GetEditStyle(context As System.ComponentModel.ITypeDescriptorContext) As System.Drawing.Design.UITypeEditorEditStyle

            Return UITypeEditorEditStyle.DropDown
  End Function

2.EditValue
指定了下拉箭头的风格后,接下来重写单击下拉箭头时会调用的函数。

Public Overrides Function EditValue(context As System.ComponentModel.ITypeDescriptorContext, provider As System.IServiceProvider, value As Object) As Object
   Dim edsc As IWindowsFormsEditorService = CType(provider.GetService(GetType(IWindowsFormsEditorService)), IWindowsFormsEditorService)  '声明一个下拉窗体以容纳我们接下来的控件
  '这里以列表框为例
  	Dim EditList As New Listbox
  EditList.AddRange({"FirstValue","SecondValue"})'简单的添加两个值,为字符串类型,**下面标记的属性也将是字符串类型**
  	if edsc IsNot Nothing  then
   edsc.DropDownControl(EditList) '将下拉控件设置为我们的列表框
  	End if
  '这个函数有个返回值,这个返回值即是设置属性的值。
  '这里以列表框的选项的值返回
 	 Return EditList.SelectedItem.tostring
  
 End Function

3.GetPaintValueSupported,重写这个函数的目的是让它支持属性框左侧的绘制。如Color属性VB.NET自定义设计器之属性编辑器自定义

 Public Overrides Function GetPaintValueSupported(context As System.ComponentModel.ITypeDescriptorContext) As Boolean
            Return True 'true显示左侧框框,false则为不显示
 End Function

4.PaintValue,这个即是绘制左侧框框的方法了,重写它,我们就能绘制想要的了。

  Public Overrides Sub PaintValue(e As System.Drawing.Design.PaintValueEventArgs)

            MyBase.PaintValue(e)
            e.Graphics.DrawString("test", New Font("宋体", 9), Brushes.Black, New Point(0, 0))

  End Sub

这里就绘制test文字上去吧
VB.NET自定义设计器之属性编辑器自定义
如图所示,但是你会发现超出了范围。实际上这里的左侧黑框,我们能通过e.bounds,进行获取,这样就可以在该范围内进行绘制了。具体可以自己调整,不多赘述了。
这里的所有方法重写完毕了。
最后
自定义一个控件类
声明一个TestPro属性,并在上面打上属性编辑器的标记如下

Public Class MyControl
	Inherits UserControl
	  <EditorAttribute(GetType(MyEditAttribute), GetType(System.Drawing.Design.UITypeEditor))>
	Public Property TestPro As String 
End Class

然后生成后即可看到TestPro左侧有绘制的文字右侧有个下拉箭头,单击后有一个下拉列表框。具体效果,可以自行测试。
文末:
本文这次仅以下拉框为例,当然也可以以另一种风格来编辑,但是都没多大区别,打开对话框即是以UITypeEditorEditStyle.Modal这个风格的。更多自行测试即可。