.net - 如何强制对系统类型使用自定义 UITypeEditor

标签 .net propertygrid

我有一个自定义的 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/

相关文章:

.net - 我应该如何使用 Git 在多台计算机上的 SharpDevelop 项目中使用 SQL Server Compact Edition?

.net - 如何自动展开 PropertyGrid 中的 ExpandableObjectConverter 对象?

c# - 不同派生类型的 WinForms 设计器属性

.net - 为 Windows 开发计划任务

c# - 有没有办法在 C# 中仅通过文件名来查找文件?

c# - 如何: Refresh PropertyGrid when user is not editing

c# - 当属性具有相同的 DisplayName 时,PropertyGrid 选择错误?

c# - PropertyGrid 属性列表

c# - 如何在 WPF 中处理长时间运行的 "thread"?

使用 ConfigureAwait(false) 的 C# async/await 链接