.net 如何在属性网格中实现StringFormat?
情景 我对一个控件进行了子分类,我想在控件的属性网格中添加一个.net 如何在属性网格中实现StringFormat?,.net,vb.net,winforms,class,user-controls,.net,Vb.net,Winforms,Class,User Controls,情景 我对一个控件进行了子分类,我想在控件的属性网格中添加一个StringFormat可扩展组,以便在设计时设置其值 问题 我无法将StringFormat属性正确添加到属性网格中,这是我得到的: 问题: 将StringFormat实现为PropertyGrid的最简单方法是什么 代码 我在这里尝试了@puropoix answer的建议:(当然我做错了) 我倾向于避免使用TypeConverter,在这种情况下,可以用一种更简单的方法来实现,因为我不确定这个实现是否需要这种头痛 Public
StringFormat
可扩展组,以便在设计时设置其值
问题
我无法将StringFormat属性正确添加到属性网格中,这是我得到的:
问题:
将StringFormat
实现为PropertyGrid
的最简单方法是什么
代码
我在这里尝试了@puropoix answer的建议:(当然我做错了)
我倾向于避免使用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
公共类MyControl:继承列表框
公共属性MyProperty As MyStringFormat=新MyStringFormat
末级
公共类MyStringFormat
公共属性myStringFormat作为StringFormat
公共分新()
'默认值(如果有)
myStringFormat=新的StringFormat
端接头
末级
公共类StringFormatConverter:继承ExpandableObjectConverter
公共重写函数ConvertTo(上下文为ITypeDescriptorContext,
作为全球化的文化,
价值作为客体,
destinationType作为类型)作为对象
返回MyBase.ConvertTo(上下文、区域性、值、destinationType)
端函数
末级
继您之前的历险之后,您需要的就是这些:
控件上的属性
将公共属性TextFormat设置为TextFormat
“一定要举例说明!
'TextFormating=新的TextFormat
使用组件方法:
公共类文本格式
继承组件
公共财产定线为直线定线
公共财产直线排列为直线排列
公共财产的削减
公共属性FormatFlags作为StringFormatFlags
末级
添加您想要的任何其他属性。您可以继承,因为它是一个密封的类,而且它没有您需要的所有属性。您不会喜欢StringFormatFlags
属性的默认行为;如果你认为类型转换器令人头痛,那你就可以享受了
由于
StringFormatFlags
是一个标志枚举,您可能希望一次拾取并组合多个标志枚举。默认的UITypeEditor是一个下拉列表,但我们需要一个下拉列表。为此,我们需要一个自定义UITypeEditor。这些并不像听起来那么可怕,但也没有必要重现车轮:
关于CodeProject的文章是一个集合编辑器框架,它还包括一个EnumTypeEditor(滚动到文章末尾,顺便提到它)。在本文的中间部分,还有一个关于类型转换器的简短入门
要使用它:
-下载文件并将DLL包含在项目中
-然后(重新)装饰您的TextFormat.TextFormatFlags
属性:
公共属性TextFormatFlags作为StringFormatFlags
(注意添加的UIEnumEditor
属性)
本文和演示展示了如何继承基本编辑器来定制一些东西。它将要做的一件事是使用描述
而不是列表中的枚举名称(如果它们存在并且需要的话)。就这样,通过两个步骤,您可以检查要组合的标志:
您不需要为此类型转换器,因为将4个属性组合成一个字符串没有多大意义。与以前一样,当您的类型继承组件时,它仍然会有空/额外下拉列表。您能让您的示例不那么抽象吗?一方面,你不需要一个可扩展的转换器,另一方面,你的转换器什么都不做。我不确定是否需要它,因为大多数用于道具栅格的转换器都是ToString和FromString。我想知道你到底想要什么-字符串格式掩码或格式标志?谢谢你的评论。我希望继承所需的类(或其他东西),我可以立即将组中StringFormat
类的所有属性成员添加到网格中,而无需付出更多的努力,因为如果我需要实现它,那么我已经可以自己手动创建每个属性了,我想问的是,是否可以动态执行,但如果将整个StringFormat
类属性同时实现到网格中比看起来更困难,那么我需要更多的道具:Alignment、FormatFlags、LineInputAlignment、Trimming
Ok,这样您就可以将其制作成包含这4个道具的expando。没有为StringFormat定义TypeConverter或UITypeEditor,因此您需要编写自己的类(此外,它是一个密封类)。但由于FormatFlags是一个按位枚举,您可能必须为它实现UITypeEditor。(我假设LineInputAlignment==LineAlignment)。您的意思是什么?:,我以前从未见过,lol。类型转换器或继承组件,因为您的类型将包含4个要编辑的内容。很抱歉,我的下一个快速且可能不相关的问题,但如果您能给出一个简短的回答:我需要一个typeconverter来从一个从组件类继承的类中完全删除摘要信息(见属性网格)?或者它只适用于expandoObject?上面没有摘要,因为我跳过了上一段中描述的TypeConverter。您将获得显示内容的属性,因为它们必须显示它们所持有的内容。是。。但我问这个问题是因为我的其他问题,您在其中回答并提到,那么,如果我想完全删除摘要信息而不是默认显示名称空间,您能澄清一下我需要使用的是TypeCo吗