Winforms PropertyGrid - 属性不可编辑

时间:2010-11-03 13:18:38

标签: c# winforms properties propertygrid

你好这是我的第一个堆栈溢出问题,请原谅我,如果我做任何愚蠢的事情。 好吧,我的问题是我正在使用一个关卡编辑器,我想使用一个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的设置中删除私人我也可以编辑它,但我不能编辑其他任何东西,哦,如果你能说出你的答案更简单,我会赞美我不是那么多一位表现出色的程序员,提前谢谢。

4 个答案:

答案 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类型编辑器。

Here's a tutorial

答案 2 :(得分:0)

  

我正在解决的问题是我不能改变值,除非它是一个布尔值

我的代码中没有看到任何解释这一点的内容。您无需执行任何特殊操作即可在属性网格中编辑intstring属性,如此最小示例所示:

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构造函数中,通过删除我可以解决问题。 谢谢你的帮助!