我刚刚尝试将PropertyGrid用于我的“游戏编辑器”,以便更轻松地编辑对象,但是如何处理未知类型呢?
例如我使用XNA,而Texture2D是XNA Framework的一种类型(其他工作得很好,例如Point / Vector)但是Texture2D只是它的核心位图,所以有没有办法“处理”未知类型和自定义PropertyGrid如何显示它们?
答案 0 :(得分:4)
您可以使用TypeConverters
有一些泛型类型转换器继承自TypeConverter并提供基本行为,其中最有用的是ExpandableObjectConverter,您可以使用它来扩展类实例。
[TypeConverter( typeof( ExpandableObjectConverter ) )]
public PhysicsObject Physics { get; private set; }
这是我的Point3结构及其自定义类型转换器的示例:
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;
}
}
}
答案 1 :(得分:0)
您不清楚“自定义”和“默认”类型之间的区别,Texure2D在xna框架中定义为Vector3或Point。但是这些都有一个DataType转换器。如果创建一个我认为是“自定义”类型的类型,则应使用TypeConverter,但是如果要自定义以常规方式显示的属性,则可以使用自定义PropertyTab和自定义PropertyDescriptors,此处仅举一个例子ozcandegirmenci.com/post/2008/08/…,您将意识到这是一个更加严格的解决方案... –布劳
http://www.ozcandegirmenci.com/post/2008/08/Extending-PropertyGrid-Adding-custom-PropertyTab-and-PropertyDescritors.aspx链接已更改。您可以到达这里。