如何在属性网格中实现StringFormat?

时间:2014-12-09 22:07:55

标签: .net vb.net winforms class user-controls

  

SCENARIO

我已对控件进行了细分,我想在控件的属性网格中添加一个StringFormat可扩展组,以便在设计时设置其值。

  

问题

我无法将StringFormat属性正确添加到属性网格中,这就是我得到的:

enter image description here

  

问题

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

1 个答案:

答案 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很头疼,那么您可以享受一下吧!

enter image description here


由于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步,你可以检查要组合的标志:

enter image description here

你不需要TypeConverter,因为将4个属性组合成一个字符串并没有多大意义。和以前一样,当Type继承Component时,它仍会有空/额外的下拉。