2010-11-03 2 views
5

Привет, это мой первый вопрос о переполнении стека, так что простите меня, если я сделаю что-нибудь глупое. Ну, моя проблема в том, что я работаю над редактором уровней, и я хочу использовать элемент управления PropertyGrid для редактирования свойств плит/сущностей и т. Д., Поэтому все работает до сих пор, значения отображаются корректно, обновляется при изменении кодового кода, но проблема заключается в том, что я не могу изменять значения, если это не логическое, я googled alot, но я просто не мог найти решений.Winforms 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, я могу редактировать это тоже, но я не могу редактировать что-нибудь еще, о и я бы appriciate, если бы вы могли рассказать свои ответы немного проще, я не так много программиста, которого я понял, заранее.

ответ

0

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

1

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

Here's a tutorial.

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 {...} 

Существует также трюк, чтобы сделать это для типов вне вашего с ontrol; при запуске приложения, выполните команду:

TypeDescriptor.AddAttributes(typeof(Vector2), 
    new TypeConverterAttribute(typeof(ExpandableObjectConverter))); 
0

проблемы я expierencing в том, что я не могу изменить значение, если оно не является булевой

Я не вижу ничего в коде, который объясняет это. Вам не нужно делать ничего особенного, чтобы сделать int или string свойства редактируемого в PropertyGrid, как показано на этом примере минимального:

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(); 
     } 
    } 
} 

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

+0

Я вижу их как регулярную сетку свойств, не выделяя ничего, что может перемещать текстовый курсор и прочее, но если я набираю (буквы или цифры), ничего не происходит. –

Смежные вопросы