2012-11-02 63 views
2

我剛剛嘗試使用PropertyGrid作爲我的「遊戲編輯器」,所以編輯對象和這樣更容易,但如何處理未知類型?PropertyGrid處理未知類型/自定義屬性

例如我使用XNA和Texture2D是一種XNA框架(其他工作正常,如Point/Vector),但Texture2D只是它的核心位圖,所以有辦法「處理」未知類型並定製PropertyGrid如何顯示它們?

回答

3

您可以使用TypeConverters

有通用型轉換器,自TypeConverter繼承和提供基本的行爲,最有效的方法之一是ExpandableObjectConverter,你可以用它來擴展類的實例。

[TypeConverter(typeof(ExpandableObjectConverter))] 
    public PhysicsObject Physics { get; private set; } 

這是我點3的結構和它的自定義類型轉換的一個例子:

namespace Microsoft.Xna.Framework 
{ 
#if WINDOWS 
    public class Point3Converter: System.ComponentModel.ExpandableObjectConverter 
    { 
     public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, Type sourceType) 
     { 
      return sourceType == typeof(string); 
     } 

     public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
     { 
      try 
      { 
       string[] tokens = ((string) value).Split(';'); 
       return new Point3(int.Parse(tokens[0]), int.Parse(tokens[1]), int.Parse(tokens[2])); 
      } 
      catch 
      { 
       return context.PropertyDescriptor.GetValue(context.Instance); 
      } 
     } 

     public override object ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) 
     { 
      Point3 p = (Point3) value; 
      return p.X +";"+ p.Y+";" + p.Z; 
     } 
    } 

    [System.ComponentModel.TypeConverter(typeof(Point3Converter))] 
#endif 
    public struct Point3 
    { 
     public int X,Y,Z; 

     public static readonly Point3 UnitX = new Point3(1, 0, 0); 
     public static readonly Point3 UnitY = new Point3(0, 1, 0); 
     public static readonly Point3 UnitZ = new Point3(0, 0, 1); 

     public Point3(int X, int Y, int Z) 
     { 
      this.X = X; 
      this.Y = Y; 
      this.Z = Z; 
     } 

     public static Vector3 operator +(Point3 A, Vector3 B) 
     { 
      return new Vector3(A.X + B.X, A.Y + B.Y, A.Z + B.Z); 
     } 

     public static Point3 operator +(Point3 A, Point3 B) 
     { 
      return new Point3(A.X + B.X, A.Y + B.Y, A.Z + B.Z); 
     } 

     public static Point3 operator -(Point3 A, Point3 B) 
     { 
      return new Point3(A.X - B.X, A.Y - B.Y, A.Z - B.Z); 
     } 

     public static Point3 operator -(Point3 A) 
     { 
      return new Point3(-A.X, -A.Y, -A.Z); 
     } 


     public override string ToString() 
     { 
      return X+";"+Y+";"+Z; 
     } 
    } 
} 
+0

由於與「默認數據類型」工作類,這是沒有必要的。我可以輕鬆地添加一個帶有幾個Vector3/Point(來自XNA Framework)的類,而無需轉換類型。但對於類似於其他類型的類型:Texture2D - > Image,我想要一些類似的例子。 – Deukalion

+0

因此,PropertyGrid可以處理Vector3和Point等,無需我自定義任何東西。 – Deukalion

+0

你問的是自定義數據類型,這是propertygrid處理它們的方式......如果更具體地說明你想要做什麼的例子,這將是非常好的。 – Blau