2010-11-03 15 views
5

Ciao questa è la mia prima domanda di overflow dello stack, quindi perdonami se faccio qualcosa di stupido. Beh, il mio problema è che sto lavorando su un editor di livelli e voglio usare un controllo PropertyGrid per modificare le proprietà di tile/entità ecc .. quindi tutto funziona fino ad ora, i valori mostrano correttamente, aggiornamento quando viene cambiato il codice tramite ma problema che sto espletando è che non posso cambiare i valori a meno che non sia un booleano, ho cercato su Google ma non ho potuto trovare soluzioni.Winforms PropertyGrid - proprietà non modificabili

Ecco il codice in cui definisco le proprietà:

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

posso modificare l'IsCollidable e se mi tolgo la privata dal set di OnScreen posso modificare anche questo, ma non riesco a modificare qualsiasi altra cosa, oh e Sarei grato se potessi esprimere le tue risposte in modo un po 'più semplice, non sono tanto un programmatore in uscita, grazie in anticipo.

risposta

0

Ho risolto, avevo this.KeyPreview = true; nel mio costruttore Form1, rimuovendo che potevo risolvere il problema. Grazie per tutto il tuo aiuto!

1

È necessario creare un UI Type Editor personalizzato per la classe Vector2.

Here's a tutorial.

5

La maggior parte dei tipi standard con proprietà pubbliche (ovvero lettura + scrittura) devono essere modificabili.

Se Vector2 è abbastanza semplice, e si desidera solo di espandersi nel PropertyGrid, quindi:

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

Se Vector2 è il proprio codice, allora si può anche decorare Vector2stesso e si applicherà a tutte le proprietà:

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

C'è anche un trucco per fare questo per i tipi al di fuori della vostra c ontrol; in fase di avvio applicazione, eseguire:

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

Il problema che sto expierencing è che non posso cambiare i valori a meno che non si tratta di un valore booleano

Non vedo nulla nel codice che spiega questo. Non è necessario fare nulla di speciale per rendere int o string proprietà modificabili in un PropertyGrid, come dimostrato da questo esempio minimo:

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

posso modificare tutte e tre le proprietà con il codice di cui sopra. Come hai stabilito che "non puoi cambiare i valori"? Cosa stai vedendo esattamente?

+0

Li vedo come una normale griglia di proprietà, non ombreggiato nulla posso spostare il cursore del testo e anche cose, ma se digito (lettere o numeri) non succede nulla. –

Problemi correlati