Как принудительно использовать пользовательский UITypeEditor для типов систем - PullRequest
4 голосов
/ 01 ноября 2010

У меня есть пользовательский UITypeEditor, который используется для выбора цвета с моей программой, использующей сетку свойств, но я не могу заставить его активироваться, если я просто выставляю system.drawing.color.Мне нужно обернуть цвет CustomType, прежде чем он вызовет мой UITypeEditor.

Обратите внимание, что свойство TheColour работает. Цвет нет.

Когда я открываю propertyGrid, я вижу, что GetEditStyle вызывается через оба метода, но когда дело доходит до EditValue, он вызывается только при выборе 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

Ответы [ 2 ]

6 голосов
/ 01 ноября 2010

Проблема в том, что он замечает, что связанный 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)));
0 голосов
/ 01 ноября 2010

Я думаю, что нашел решение этой проблемы.

Мне нужно было реализовать TypeConverter, чтобы заставить GetStandardValuesSupported возвращать false.

Затем я могу покончить со свойством TheColour ипросто используйте.

<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, поэтому я также добавил некоторые переопределения в Converterпросто верните пустые строки.(Я бы предпочел закрасить всю ячейку цветом, а не просто маленьким квадратиком).

Класс Converter.

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
...