2012-11-02 1 views
2

"Game Editor"에 PropertyGrid를 사용하여 Object 등을 쉽게 편집 해 보았습니다.하지만 알 수없는 유형은 어떻게 처리합니까?알 수없는 유형/사용자 정의 속성을 처리하는 PropertyGrid

예를 들어 XNA를 사용하고 Texture2D는 XNA Framework 유형입니다 (다른 것들은 Point/Vector와 같이 잘 작동합니다). 그러나 Texture2D는 핵심 부분의 비트 맵이므로 알 수없는 유형을 "처리"할 수있는 방법이 있습니다. PropertyGrid에서 표시 방법을 사용자 정의 할 수 있습니까?

답변

3

당신은 TypeConverters

이 TypeConverter에서 상속 제네릭 형식 컨버터가 있습니다 사용하고 기본 동작을 제공 할 수있는 가장 유용한 중 하나는 클래스 인스턴스를 확장하는 데 사용할 수있는, ExpandableObjectConverter입니다.

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

"기본 데이터 유형"작품에 클래스가이 필요하지 않기 때문에 :

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

내 POINT3 구조 및 사용자 정의 형식 변환기의 예입니다. 유형을 변환 할 필요없이 (XNA Framework에서) Vector3/Point가있는 클래스를 쉽게 추가 할 수 있습니다. 그러나 다른 사람들과 유사한 유형 인 Texture2D -> Image의 경우, 나는 그것을 위해 몇 가지 예를 원합니다. – Deukalion

+0

그래서 PropertyGrid는 Vector3와 Point 등을 처리합니다. 아무 것도 사용자 정의 할 필요가 없습니다. – Deukalion

+0

사용자 정의 데이터 유형에 대해 묻는 것은 propertygrid가 처리하는 방법입니다 ... 원하는 작업의 예에 대해 더 구체적으로 설명하면 멋질 것입니다. – Blau