首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对系统类型强制使用自定义UITypeEditor

如何对系统类型强制使用自定义UITypeEditor
EN

Stack Overflow用户
提问于 2010-11-01 06:26:38
回答 2查看 3.4K关注 0票数 4

我有一个定制的UITypeEditor,在使用属性网格的程序中用于颜色选择,但是如果我只公开system.drawing.color,我似乎无法激活它。我需要用CustomType包装颜色,然后它才会调用我的UITypeEditor。

注意它工作的属性TheColour。颜色没有。

当我打开propertyGrid时,我可以看到GetEditStyle是通过这两种方法调用的,但是对于EditValue,只有在属性网格中选择TheColour时才会调用。当您选择“颜色”属性时,将显示普通颜色下拉列表。

我遗漏了什么?

代码语言:javascript
复制
<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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-01 07:10:44

问题是,它注意到关联的TypeConverter支持枚举值。我们需要禁用它;注意,我们还可以从默认实现继承颜色预览绘画( C#中的示例,但应该很容易翻译):

代码语言:javascript
复制
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属性,也有一种方法可以使您不需要装饰每个属性;在应用程序初始化代码的某个地方,执行:

代码语言:javascript
复制
TypeDescriptor.AddAttributes(typeof(Color),
    new EditorAttribute(typeof(MyColorEditor), typeof(UITypeEditor)),
    new TypeConverterAttribute(typeof(MyColorConverter)));
票数 6
EN

Stack Overflow用户

发布于 2010-11-01 07:35:23

我想我已经找到了解决这个问题的办法。

我需要实现一个TypeConverter,以强制GetStandardValuesSupported返回false。

然后,我可以取消TheColour属性,只需使用。

代码语言:javascript
复制
<CategoryAttribute("Order Colour"), _
Browsable(True), _
DisplayName("Custom Colour to Use"), _
Description("The background colour for orders from this terminal"), _
EditorAttribute(GetType(IKMDependency.ColourSelectorEditor), GetType(System.Drawing.Design.UITypeEditor)), _
TypeConverter(GetType(ColourTypeConverter))> _
Public Property Colour() As Color
    Get
        Return mColor
    End Get
    Set(ByVal value As Color)
        If mColor <> value Then
            mColor = value
            mIsDirty = True
        End If
    End Set
End Property

这有点难看,因为颜色是用选定的颜色在框中表示的,但是文本是在PropertyGridCell的其余部分中打印的,所以我还向转换器添加了一些重写,以返回空字符串。(我宁愿把整个细胞涂成颜色,而不仅仅是小盒子)。

转换器类。

代码语言:javascript
复制
Public Class ColourTypeConverter
    Inherits TypeConverter

    Public Overrides Function GetStandardValuesSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
        Return False
    End Function

    Public Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
        If sourceType Is GetType(String) Then Return False
        Return MyBase.CanConvertFrom(context, sourceType)
    End Function

    Public Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
        If destinationType Is GetType(String) Then Return String.Empty
        Return MyBase.ConvertTo(context, culture, value, destinationType)
    End Function

    Public Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
        Return MyBase.ConvertFrom(context, culture, value)
    End Function

    Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
        If destinationType Is GetType(String) Then Return False
        Return MyBase.CanConvertTo(context, destinationType)
    End Function
End Class
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4067010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档