2011-07-27 10 views
6

No estoy seguro de por qué ocurre esto, pero yo quiero ser capaz de modificar el valor de color XNA:WinForms propiedad de cuadrícula no permitirá que cambie el valor struct

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; } 
} 

pensé que tenga el atributo ExpandableObjectConverter haría arregle el problema, pero aún no lo ha hecho.

Editar: yo era capaz de parchear juntas el siguiente código de trabajo:

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; 
    } 
} 
+0

actualice su código, reemplace [System.ComponentModel.TypeConverter (typeof (System.ComponentModel.ExpandableObjectConverter))] con su CustomConverter – Antonio

Respuesta

3

ExpandableConverter solo mostrará las propiedades internas de un color. No podrá editar R, G, B y A ya que solo tienen accesadores. El uso de ColorConverter tampoco le mostrará estas propiedades, por lo que esta no es una solución. Deberá escribir su propio convertidor. Use Reflector y eche un vistazo a FontConverter, por ejemplo. Verá cómo CreateInstance se puede usar para construir un nuevo Color a partir de sus propiedades.

Cuestiones relacionadas