你好这是我的第一个堆栈溢出问题,请原谅我,如果我做任何愚蠢的事情。 好吧,我的问题是我正在使用一个关卡编辑器,我想使用一个PropertyGrid控件来编辑磁贴/实体的属性等。所以到目前为止一切正常,值显示正确,更改时通过代码更改但问题我是expierencing是我不能改变值,除非它是一个布尔值,我googled很多但我只是找不到解决方案。
以下是我定义属性的代码:
[Description("Defines the Position on the screen")]
public Vector2 screenpos { get; set; }
Vector2 WorldPos;
[Description("Defines the texture of the selected tile")]
public string texture { get; set; }
[Description("Defines if the player can collide with this tile")]
public bool IsCollidable { get; set; }
[Description("Defines on what layer this tile is drawn (1-3)")]
public int Layer { get; set; }
[Description("Shows if the tile is currently visible on the screen")]
public bool OnScreen { get; private set; }
我可以编辑IsCollidable,如果我从OnScreen的设置中删除私人我也可以编辑它,但我不能编辑其他任何东西,哦,如果你能说出你的答案更简单,我会赞美我不是那么多一位表现出色的程序员,提前谢谢。
答案 0 :(得分:5)
大多数具有公共属性(即读取+写入)的标准类型都应该是可编辑的。
如果Vector2
相当简单,并且您只是希望它在PropertyGrid
中展开,那么:
[Description("Defines the Position on the screen")]
[TypeConverter(typeof(ExpandableObjectConverter))]
public Vector2 screenpos { get; set; }
如果Vector2
是您自己的代码,那么您还可以装饰Vector2
本身,它将适用于所有属性:
[TypeConverter(typeof(ExpandableObjectConverter))]
public {class|struct} Vector2 {...}
对于控件之外的 类型,还有一个技巧。在应用启动时,运行:
TypeDescriptor.AddAttributes(typeof(Vector2),
new TypeConverterAttribute(typeof(ExpandableObjectConverter)));
答案 1 :(得分:1)
您需要为Vector2
课程创建自定义UI类型编辑器。
答案 2 :(得分:0)
我正在解决的问题是我不能改变值,除非它是一个布尔值
我的代码中没有看到任何解释这一点的内容。您无需执行任何特殊操作即可在属性网格中编辑int
或string
属性,如此最小示例所示:
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication13
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
public class Test
{
public string StringProperty { get; set; }
public int IntProperty { get; set; }
public bool BoolProperty { get; set; }
}
class MainForm : Form
{
public MainForm()
{
var propertyGrid = new PropertyGrid() { Dock = DockStyle.Fill };
this.Controls.Add(propertyGrid);
propertyGrid.SelectedObject = new Test();
}
}
}
我可以使用上面的代码编辑所有三个属性。你是如何确定你“不能改变价值观”的?你到底看到了什么?
答案 3 :(得分:0)
我修好了,我有了.KeyPreview = true;在我的Form1构造函数中,通过删除我可以解决问题。 谢谢你的帮助!