2
我剛剛嘗試使用PropertyGrid作爲我的「遊戲編輯器」,所以編輯對象和這樣更容易,但如何處理未知類型?PropertyGrid處理未知類型/自定義屬性
例如我使用XNA和Texture2D是一種XNA框架(其他工作正常,如Point/Vector),但Texture2D只是它的核心位圖,所以有辦法「處理」未知類型並定製PropertyGrid如何顯示它們?
我剛剛嘗試使用PropertyGrid作爲我的「遊戲編輯器」,所以編輯對象和這樣更容易,但如何處理未知類型?PropertyGrid處理未知類型/自定義屬性
例如我使用XNA和Texture2D是一種XNA框架(其他工作正常,如Point/Vector),但Texture2D只是它的核心位圖,所以有辦法「處理」未知類型並定製PropertyGrid如何顯示它們?
您可以使用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;
}
}
}
由於與「默認數據類型」工作類,這是沒有必要的。我可以輕鬆地添加一個帶有幾個Vector3/Point(來自XNA Framework)的類,而無需轉換類型。但對於類似於其他類型的類型:Texture2D - > Image,我想要一些類似的例子。 – Deukalion
因此,PropertyGrid可以處理Vector3和Point等,無需我自定義任何東西。 – Deukalion
你問的是自定義數據類型,這是propertygrid處理它們的方式......如果更具體地說明你想要做什麼的例子,這將是非常好的。 – Blau