我有一个自定义的 UITypeEditor,用于使用 propertygrid 与我的程序进行颜色选择,但如果我只公开 system.drawing.color,我似乎无法激活它。我需要用 CustomType 包装 Color,然后它才会调用我的 UITypeEditor。
注意属性TheColour它的工作原理。 颜色没有。
当我打开 propertyGrid 时,我可以看到 GetEditStyle
是通过两种方法调用的,但是当涉及到 EditValue
时,只有当您在 propertygrid 中选择 TheColour 时才会调用它。当您选择“颜色属性”时,将显示“正常颜色”下拉列表
我错过了什么?
<CategoryAttribute("Order Colour"), _
Browsable(True), _
DisplayName("The Colour"), _
Description("The background colour for orders from this terminal"), _
EditorAttribute(GetType(IKMDependency.ColourSelectorEditor), _
GetType(System.Drawing.Design.UITypeEditor))> _
Public Property TheColour() As MyColour
Get
Return mMyColor
End Get
Set(ByVal value As MyColour)
If value.Colour <> mMyColor.Colour Then
mColor = value.Colour
mMyColor = value
mIsDirty = True
End If
End Set
End Property
<CategoryAttribute("Order Colour"), _
Browsable(True), _
DisplayName("Colour"), _
Description("The background colour for orders from this terminal"), _
EditorAttribute(GetType(IKMDependency.ColourSelectorEditor), _
GetType(System.Drawing.Design.UITypeEditor))> _
Public Property Colour() As Color
Get
Return mColor
End Get
Set(ByVal value As Color)
If mColor <> value Then
mColor = value
mMyColor = New MyColour(mColor)
mIsDirty = True
End If
End Set
End Property
最佳答案
问题在于它注意到关联的 TypeConverter
支持枚举值。我们需要禁用它;请注意,我们还可以继承默认实现来获取诸如颜色预览绘画之类的内容(C# 中的示例,但应该很容易翻译):
class MyColorEditor : ColorEditor {
public override UITypeEditorEditStyle GetEditStyle(
ITypeDescriptorContext context) {
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(
ITypeDescriptorContext context, IServiceProvider provider, object value) {
MessageBox.Show(
"We could show an editor here, but you meant Green, right?");
return Color.Green;
}
}
class MyColorConverter : ColorConverter { // reference: System.Drawing.Design.dll
public override bool GetStandardValuesSupported(
ITypeDescriptorContext context) {
return false;
}
}
class TestObject
{
[Category("Order Colour"), Browsable(true), DisplayName("Colour")]
[Description("The background colour for orders from this terminal")]
[Editor(typeof(MyColorEditor), typeof(UITypeEditor))]
[TypeConverter(typeof(MyColorConverter))]
public Color Colour {get;set;}
}
如果您希望将其应用于所有 Color
属性,还有一种方法可以做到这一点,这样您就不需要装饰每个属性;在应用程序初始化代码的某个位置,执行:
TypeDescriptor.AddAttributes(typeof(Color),
new EditorAttribute(typeof(MyColorEditor), typeof(UITypeEditor)),
new TypeConverterAttribute(typeof(MyColorConverter)));
关于.net - 如何强制对系统类型使用自定义 UITypeEditor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4067010/