WinForms Property Grid не позволяет мне изменить значение структуры

Не совсем понимаю, почему это происходит, но я хочу иметь возможность изменить значение цвета XNA:

private Color _color = Color.White;

[System.ComponentModel.Category("VisibleInEditor")]
[System.ComponentModel.TypeConverter(typeof(System.ComponentModel.ExpandableObjectConverter))]
public Color Color
{
    get { return _color; }
    set { _color = value; }
}

Я думал, что наличие атрибута ExpandableObjectConverter решит проблему, но пока этого не произошло итак.

Изменить: мне удалось исправить следующий рабочий код:

public class ColorTypeConverter : ExpandableObjectConverter
{
    public override bool CanConvertTo(ITypeDescriptorContext context, System.Type destinationType)
    {
        return destinationType == typeof(Color);
    }

    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType)
    {
        if (destinationType == typeof(string) && value is Color)
        {
            Color color = (Color)value;
            return string.Format("{0}, {1}, {2}, {3}", color.R, color.G, color.B, color.A);
        }
        else return base.ConvertTo(context, culture, value, destinationType);
    }

    public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType)
    {
        return sourceType == typeof(string);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        if (value is string)
        {
            try
            {
                string strVal = value as string;
                var parts = strVal.Split(',');

                byte r = byte.Parse(parts[0]);
                byte g = byte.Parse(parts[1]);
                byte b = byte.Parse(parts[2]);
                byte a = byte.Parse(parts[3]);

                return new Color(r, g, b, a);
            }
            catch
            {
                throw new ArgumentException("Can not convert '" + (string)value + "'to type Color");
            }
        }
        else return base.ConvertFrom(context, culture, value);
    }
    public override object CreateInstance(ITypeDescriptorContext context, System.Collections.IDictionary propertyValues)
    {
        return new Color((byte)propertyValues["R"], (byte)propertyValues["G"], (byte)propertyValues["B"], (byte)propertyValues["A"]);
    }
    public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
    {
        return true;
    }
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
    {
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value, attributes);

        string[] sortOrder = new string[4];

        sortOrder[0] = "R";
        sortOrder[1] = "G";
        sortOrder[2] = "B";
        sortOrder[3] = "A";

        // Return a sorted list of properties
        return properties.Sort(sortOrder);
    }

    public override bool GetPropertiesSupported(ITypeDescriptorContext context)
    {
        return true;
    }
}
6
задан MintGrowth 27 July 2011 в 18:24
поделиться