2010-11-03 14 views
5

Bonjour, c'est ma première question de débordement de pile, alors pardonnez-moi si je fais quelque chose de stupide. Eh bien mon problème est que je travaille sur un éditeur de niveau et je veux utiliser un contrôle PropertyGrid pour éditer les propriétés des carreaux/entités etc .. tout fonctionne jusqu'à maintenant, les valeurs s'affichent correctement, mise à jour lorsque le code creux changé, mais le Le problème que j'expérimente est que je ne peux pas changer les valeurs à moins que ce soit un booléen, je googled beaucoup mais je pourrais simplement ne trouver aucune solution.Winforms PropertyGrid - propriétés non modifiables

Voici le code où i définir les propriétés:

[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; } 

Je peux modifier la IsCollidable et si je retire le privé de la série de OnScreen je peux modifier cela aussi, mais je ne peux pas modifier quoi que ce soit d'autre, oh et J'apprécierais si vous pouviez motiver vos réponses un peu plus simple je ne suis pas tellement programmeur expierenced, merci d'avance.

Répondre

0

Je l'ai corrigé, j'avais ceci.KeyPreview = true; dans mon constructeur Form1, en supprimant que je pourrais résoudre le problème. Merci pour votre aide!

1

Vous devez créer un éditeur de type d'interface utilisateur personnalisé pour votre classe Vector2.

Here's a tutorial.

5

La plupart des types standard avec une propriété publique (c'est-à-dire en lecture et écriture) doivent être modifiables.

Si Vector2 est assez simple, et vous voulez juste à se développer dans le PropertyGrid, puis:

[Description("Defines the Position on the screen")] 
[TypeConverter(typeof(ExpandableObjectConverter))] 
public Vector2 screenpos { get; set; } 

Si Vector2 est votre propre code, vous pouvez également se décorer Vector2 et appliquera à toutes les propriétés:

[TypeConverter(typeof(ExpandableObjectConverter))] 
public {class|struct} Vector2 {...} 

Il y a aussi une astuce pour le faire pour les types en dehors de votre c ontrol; au démarrage de l'application, exécutez:

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

le problème je suis expierencing est que je ne peux pas changer les valeurs que si elle est un booléen

Je ne vois rien dans votre code qui explique cela. Vous n'avez pas besoin de faire quelque chose de spécial pour faire int ou propriétés string modifiables dans un PropertyGrid, comme le démontre cet exemple minimal:

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

je peux modifier les trois propriétés avec le code ci-dessus. Comment avez-vous déterminé que vous "ne pouvez pas changer les valeurs"? Que voyez-vous exactement?

+0

Je les vois comme une grille de propriété régulière, pas grisée, je peux déplacer le curseur de texte et d'autres choses mais si je tape (lettres ou chiffres) rien ne se passe. –