Winforms PropertyGrid - свойства не редактируются - PullRequest
5 голосов
/ 03 ноября 2010

Здравствуйте, это мой первый вопрос о переполнении стека, так что простите, если я сделаю что-нибудь глупое. Ну, моя проблема в том, что я работаю над редактором уровней, и я хочу использовать элемент управления PropertyGrid для редактирования свойств плиток / сущностей и т. Д., Так что пока все работает, значения отображаются правильно, обновляются при изменении кода, но проблема у меня есть опыт в том, что я не могу изменить значения, если это не логическое значение, я много гуглил, но просто не мог найти решения.

Вот код, в котором я определяю свойства:

    [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 ]

5 голосов
/ 03 ноября 2010

Большинство стандартных типов с открытым свойством (то есть read + write) должны быть редактируемыми.

Если 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 голос
/ 03 ноября 2010

Вам необходимо создать собственный редактор типов пользовательского интерфейса для вашего Vector2 класса.

Вот учебник .

0 голосов
/ 03 ноября 2010

Я исправил это, у меня было это. KeyPreview = true;в моем конструкторе Form1, удалив, что я мог бы решить проблему.Спасибо за вашу помощь!

0 голосов
/ 03 ноября 2010

проблема, которую я использую, заключается в том, что я не могу изменить значения, если это не логическое значение

Я не вижу в вашем коде ничего, что объясняет это. Вам не нужно делать ничего особенного, чтобы сделать свойства 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();
      }
   }
}

Я могу редактировать все три свойства с помощью приведенного выше кода. Как вы определили, что вы «не можете изменить значения»? Что именно ты видишь?

...