2011-07-27 4 views
6

かなりわからない構造体の値を変更することはできません。問題を解決するが、それはまだ行われていない。WinFormsのプロパティグリッドは、私はなぜこれが起こっているが、私はXNAの色の値を変更できるようにしたい

編集:ExpandableConverterはちょうど色の内側のプロパティを表示します

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

コードを更新し、[System.ComponentModel.TypeConverter(typeof(System.ComponentModel.ExpandableObjectConverter))]をCustomConverterに置き換えてください – Antonio

答えて

3

:私は一緒に次の作業のコードにパッチを適用することができました。あなたはR、G、B、Aを編集することはできません。なぜならそれらはアクセサしか持たないからです。 ColorConverterを使用してもこれらのプロパティは表示されないので、これは解決策ではありません。独自のコンバータを作成する必要があります。 Reflectorを使って、例えばFontConverterを見てください。 CreateInstanceを使って、そのプロパティから新しいColorを構築する方法を知ることができます。

関連する問題