Domanda

Attualmente sto sperando di usare un PropertyGrid per consentire agli utenti di modificare alcune delle mie classi, tuttavia ho colpito un muro con il passaggio di oggetti agli UITypeEditor che usano. Quando l'utente preme il menu a discesa, voglio mostrare una casella di riepilogo di trame già caricate tra cui scegliere, se vogliono usare una trama che l'applicazione non ha ancora caricato, possono fare clic su un pulsante per sceglierne uno dalla finestra di dialogo di un file. Nel caso in cui non abbia senso qui una derisione del modulo:

Immagine a discesa.

Il mio problema: per riempire la casella di riepilogo 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 riferimento sulla creazione al loro oggetto di gestione. In UITypeEditor uso quindi 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 come sono le classi che sto usando:

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 esaminato le mie opzioni e sembrano essere:

  1. Rende statiche le classi di gestione.

Non voglio davvero farlo. Esistono diverse classi di gestione poiché ciascuna risorsa viene caricata in modo diverso. Ci sono anche classi che devono essere create prima di queste e che vengono passate.

  1. Rendi singleton le classi dirigenti.

Neanche io voglio davvero farlo. Sembra un modo rapido e sporco per "nascondere" il problema invece di "risolvere" esso. Potrei anche desiderare l'opzione di avere in futuro diverse classi di gestione che i singoli elimineranno.

  1. Crea una classe wrapper che contiene il riferimento a una classe di gestione e alla sua destinazione (come XNA Texture2D).

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

Qualche idea su quanto sopra o altri metodi per passare ciò di cui ho bisogno in UITypeEditor?

Grazie per aver letto.

È stato utile?

Soluzione

Nel metodo EditValue, viene fornito un contesto. Usa context.Instance per accedere all'oggetto che contiene la tua proprietà. Questo oggetto dovrebbe contenere anche una proprietà che ti consente di accedere all'elenco delle cose che desideri visualizzare. È possibile verificare se context.Instance è ITextureProvider ad esempio, quindi eseguirne il cast e accedere alle trame. Non sono sicuro che abbia senso nel tuo design, ma fammi sapere.

Altri suggerimenti

In alternativa puoi 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, puoi mostrare un set di valori in un modulo e un altro set in un altro.

  1. Crea un'interfaccia IYourDataProviderService.
  2. Crea un'implementazione di IYourDataProviderService, che conosce i dati concreti da fornire.
  3. Crea 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 (tranne la proprietà DesignMode) e per me ha funzionato, ma probabilmente questa non è una soluzione ideale.
  4. Nel gestore di eventi "Carica" ??assegna la tua implementazione alla proprietà Sito della tua proprietàgrid.
  5. Buon divertimento!
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top