2011-07-27 15 views
6

oldukça emin niçin bu oluyor, ama XNA renk değeri değiştirmek mümkün istiyorum:WinForms Mülkiyet Izgara bana yapı değerini değiştirmek izin vermez

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

Ben ExpandableObjectConverter niteliğini haiz düşünce olur sorunu düzeltin, ancak henüz yapmadı.

Düzenleme:

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

Lütfen kodunuzu güncelleyin, [System.ComponentModel.TypeConverter (typeof (System.ComponentModel.ExpandableObjectConverter))] yerine CustomConverter yazın – Antonio

cevap

3

ExpandableConverter bir Rengin iç özelliklerini sadece gösterecektir: Aşağıdaki çalışma kodu araya yama başardı. R, G, B ve A’yı düzenleyemezsiniz, çünkü sadece erişim sağlayıcıları vardır. ColorConverter kullanmak size bu özellikleri göstermeyecektir, bu yüzden bu bir çözüm değildir. Kendi dönüştürücünüzü yazmanız gerekecek. Reflector kullanın ve örneğin FontConverter bir göz atın. CreateInstance'ın özelliklerinden yeni bir Renk oluşturmak için nasıl kullanılacağını göreceksiniz.

İlgili konular