SCENARIO
我已对控件进行了细分,我想在控件的属性网格中添加一个StringFormat
可扩展组,以便在设计时设置其值。
问题
我无法将StringFormat属性正确添加到属性网格中,这就是我得到的:
问题
将StringFormat
实施为PropertyGrid
?
CODE
我在这里尝试了@Plutonix的建议:Create an expandable group in a property grid?(确定我做错了)
如果可以以更简单的方式完成此操作,我会避免使用TypeConverter
,因为我不确定此实现是否需要这种头痛。
Public Class MyControl: Inherits ListBox
Public Property MyProperty As MyStringFormat = New MyStringFormat
End Class
<TypeConverter(GetType(StringFormatConverter))>
Public Class MyStringFormat
<Browsable(True)>
<NotifyParentProperty(True)>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Property myStringFormat As StringFormat
Public Sub New()
' default values, if any
myStringFormat = New StringFormat
End Sub
End Class
Public Class StringFormatConverter : Inherits ExpandableObjectConverter
Public Overrides Function ConvertTo(context As ITypeDescriptorContext,
culture As Globalization.CultureInfo,
value As Object,
destinationType As Type) As Object
Return MyBase.ConvertTo(context, culture, value, destinationType)
End Function
End Class
答案 0 :(得分:2)
继续您之前的冒险之旅,这就是您所需要的:
' property on the control
<Browsable(True), EditorBrowsable(EditorBrowsableState.Always),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
DefaultValue(-1)>
Public Property TextFormating As TextFormat
' be sure to instance it!
' TextFormating = New TextFormat
使用Component方法:
Public Class TextFormat
Inherits Component
<Browsable(True), NotifyParentProperty(True),
DesignerSerializationVisibility(DesignerSerializationVisibility.Visible),
EditorBrowsable(EditorBrowsableState.Always), DefaultValue(-1)>
Public Property Alignment As StringAlignment
<Browsable(True), NotifyParentProperty(True),
DesignerSerializationVisibility(DesignerSerializationVisibility.Visible),
EditorBrowsable(EditorBrowsableState.Always), DefaultValue(-1)>
Public Property LineAlignent As StringAlignment
<Browsable(True), NotifyParentProperty(True),
DesignerSerializationVisibility(DesignerSerializationVisibility.Visible),
EditorBrowsable(EditorBrowsableState.Always), DefaultValue(-1)>
Public Property Trimming As StringTrimming
<Browsable(True), NotifyParentProperty(True),
Editor(GetType(UIEnumEditor), GetType(UITypeEditor)),
DesignerSerializationVisibility(DesignerSerializationVisibility.Visible),
EditorBrowsable(EditorBrowsableState.Always), DefaultValue(-1)>
Public Property FormatFlags As StringFormatFlags
End Class
添加您想要的任何其他属性。您可以继承,因为它是一个密封的类,它也没有您需要的所有属性。你不喜欢StringFormatFlags
属性的默认行为;如果您认为TypeConverter很头疼,那么您可以享受一下吧!
由于StringFormatFlags
是一个标志枚举,您可能希望一次挑选几个。默认的UITypeEditor虽然是DropDown,但我们需要一个DropDownCheckList。为此,我们需要一个自定义的UITypeEditor。这些并不像听起来那么可怕,但也没有必要重新创建轮子:
CodeProject上的Enhanced CollectionEditor Framework文章是一个集合编辑器框架,它还包含一个EnumTypeEditor(滚动到文章的末尾,传递中提到它)。在文章的中间部分也是关于TypeConverters
的简要介绍。
使用它:
- 下载文件并在项目中包含DLL
- 然后(重新)装饰你的TextFormat.TextFormatFlags
财产:
<Editor(GetType(UIEnumEditor), GetType(UITypeEditor)),
Browsable(True), NotifyParentProperty(True),
DesignerSerializationVisibility(DesignerSerializationVisibility.Visible),
EditorBrowsable(EditorBrowsableState.Always), DefaultValue(0)>
Public Property TextFormatFlags As StringFormatFlags
(请注意添加的UIEnumEditor
属性)。
文章和演示展示了如何继承基本编辑器来自定义一些东西。它将做的一件事是使用Descriptions
而不是列表中的枚举名称,如果它们存在并且如果你想要的话。就是这样,2步,你可以检查要组合的标志:
你不需要TypeConverter,因为将4个属性组合成一个字符串并没有多大意义。和以前一样,当Type继承Component时,它仍会有空/额外的下拉。