2009-06-18 18 views
5

Attualmente sto sperando di usare un PropertyGrid per consentire agli utenti di modificare alcune delle mie classi, però ho colpito un muro con il passaggio degli oggetti al UITypeEditor (s) che utilizzano. Quando l'utente preme il menu a discesa voglio mostrare una casella di riepilogo di texture già caricati da scegliere, se vogliono usare una texture l'applicazione non è stata caricata però, che può fare clic su un pulsante per scegliere uno da una finestra di dialogo. Nel caso in cui faccio alcun senso qui un modello di forma:Passaggio di oggetti a un UITypeEditor

Dropdown Image.

Il mio problema: Per riempire la lista ho bisogno di accedere alla classe che gestisce l'elenco delle risorse da UITypeEditor.

ora ho risolto questo problema per le mie classi, dando loro un punto di riferimento sulla creazione al loro oggetto gestione. In UITypeEditor, quindi, utilizzo quel riferimento per accedere a ciò di cui ho bisogno. Tuttavia non posso farlo per le classi che non ho scritto, come la classe XNA Texture2D.

Ecco quali sono le classi che sto usando assomigliare:

class StaticGeometryChunk 
{ 
    // Geometry data to draw with. Contains a reference to its managing 
    // class for use in its UITypeEditor. 
    public GeometryData { get; set; } 
    .... 
} 

class Material 
{ 
    // These are XNA classes. I can't just add a reference to its managing 
    // class (I think?). 
    public Texture2D Texture1 { get; set; } 
    public Texture2D Texture2 { get; set; } 
    .... 
} 

ho cercato le mie opzioni e sembrano essere:

  1. Effettuare le classi dirigenti statica.

non voglio veramente fare questo. Esistono diverse classi di gestione poiché ogni risorsa viene caricata in modo diverso. Ci sono anche classi che devono essere create prima di queste e passate.

  1. Rende le classi di gestione singleton.

Non voglio veramente fare questa operazione. Sembra un modo rapido e sporco per "nascondere" il problema invece di "risolvere" esso. Potrei anche volere la possibilità di avere diverse classi di gestione nel futuro che i singleton eliminano.

  1. Creare una classe wrapper che contenga il riferimento a una classe di gestione e il relativo target (ad esempio XNA Texture2D).

Questo è attualmente quello che sto pensando di fare. Sarebbe piuttosto semplice e veloce da fare, ma qualcosa mi tormenta ma non so cosa.

Ogni pensiero su metodi di cui sopra o di altri di passare quello che mi serve in UITypeEditor?

Grazie per la lettura.

risposta

9

Nel metodo EditValue, si è data un contesto. Usa context.Instance per accedere all'oggetto che contiene la proprietà. Questo oggetto dovrebbe contenere anche una proprietà che ti dà accesso alla lista di cose che vuoi mostrare. Si potrebbe verificare se context.Instance è ITextureProvider per esempio, allora lanci e accedere le texture. Non sono sicuro se questo abbia un senso nel tuo progetto, ma fammi sapere.

+0

Il mio progetto attuale si presenta così: MaterialDatabase: Contiene un dizionario di materiali contenenti le classi Texture2D. GeometryDatabase: contiene un dizionario di StaticGeometryChunks che contiene GeometryData. TileDatabase: contiene un dizionario di tile che contiene uno StaticGeometryChunk e un materiale. Quando queste classi vengono create vengono passate una treeview per visualizzare ciò che hanno caricato, è una selezione sulla vista ad albero che attiva il propertygrid per visualizzare il tag dei nodi (un riferimento all'oggetto del dizionario). Ho la sensazione che questo significhi che il contesto sarà la vista ad albero? – Kath

+0

Scusa se la mia formattazione è scomparsa e ho esaurito i caratteri. Grazie per la risposta. La classe generale principale è la Tile, usano gli altri due oggetti (Materials/Geometry) per i suoi dati. Questo è così che se un utente cambia una trama in un materiale, anche tutte le tessere che usano quel materiale ottengono la modifica. Potrebbe leggermente riprogettare questa configurazione? Contesto – Kath

+0

. La sostanza è il proprietario della proprietà. Nel tuo caso, sarebbe Materiale. Quindi, questa classe Materiale dovrebbe essere in grado di accedere alle possibili trame. –

4

In alternativa si può provare il seguente approccio. Lo trovo molto elegante, perché non richiede di memorizzare un elenco di valori di proprietà disponibili nell'oggetto. Pertanto, ad esempio, è possibile mostrare un set di valori su un modulo e un altro su un altro.

  1. Creare un'interfaccia IYourDataProviderService.
  2. Creare un'implementazione di IYourDataProviderService, che conosce i dati concreti da fornire.
  3. Creare una classe che implementa ISITE. Nel metodo GetService() restituisce un'istanza di classe che implementa IYourDataProviderService, se il parametro serviceType è typeof (IYourDataProviderService). Ho lasciato il resto dei metodi ISITE lanciando NotImplementedException (eccetto la proprietà DesignMode) e per me ha funzionato, ma probabilmente questa non è una soluzione ideale.
  4. Nel gestore eventi "Load", assegnare l'implementazione alla proprietà Site del proprio propertygrid.
  5. Buon divertimento!
Problemi correlati