Question

J'espère actuellement utiliser un PropertyGrid pour permettre aux utilisateurs de modifier certaines de mes classes. Cependant, je me suis heurté à un mur avec la transmission d'objets au (x) UITypeEditor (s) qu'ils utilisent. Lorsque l'utilisateur appuie sur la liste déroulante, je souhaite afficher une liste de textures déjà chargées parmi lesquelles choisir. Si l'utilisateur souhaite utiliser une texture, l'application ne l'a pas encore chargée, il peut cliquer sur un bouton pour en choisir une dans une boîte de dialogue de fichier. Au cas où je n’aurais aucun sens ici, une maquette de la forme:

Image déroulante.

Mon problème: pour remplir la zone de liste, j'ai besoin d'un accès à la classe qui gère la liste des ressources à partir de UITypeEditor.

Maintenant, j'ai résolu ce problème pour mes propres classes en leur donnant une référence sur la création à leur objet de gestion. Dans UITypeEditor, j'utilise ensuite cette référence pour accéder à ce dont j'ai besoin. Cependant, je ne peux pas le faire pour des classes que je n'ai pas écrites, telles que la classe XNA Texture2D.

Voici à quoi ressemblent les classes que j'utilise:

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

J'ai examiné mes options et elles semblent être:

  1. Rendre les classes de gestion statiques.

Je ne veux pas vraiment faire ça. Il existe plusieurs classes de gestion car chaque ressource est chargée différemment. Il y a aussi des classes qui doivent être créées avant celles-ci et qui sont passées.

  1. Définissez les singletons des classes de gestion.

Je ne veux pas vraiment faire ça non plus. Cela semble être un moyen rapide et sale de "masquer". le problème au lieu de " résoudre " il. Je souhaiterais peut-être aussi avoir l’option d’avoir plusieurs classes de gestion dans le futur que les singletons élimineront.

  1. Créez une classe wrapper contenant la référence à une classe de gestion et à sa cible (telle que XNA Texture2D).

C’est actuellement ce que je pense faire. Ce serait assez simple et rapide à faire, mais quelque chose me choque mais je ne sais pas quoi.

Avez-vous des idées sur ce qui précède ou sur d'autres méthodes pour transférer ce dont j'ai besoin dans l'éditeur UITypeEditor?

Merci d'avoir lu.

Était-ce utile?

La solution

Dans la méthode EditValue, un contexte vous est attribué. Utilisez context.Instance pour accéder à l'objet contenant votre propriété. Cet objet doit également contenir une propriété qui vous donne accès à la liste des éléments que vous souhaitez afficher. Vous pouvez tester si context.Instance est par exemple ITextureProvider, puis lancez-le et accédez aux textures. Je ne sais pas si cela a du sens dans votre conception, mais faites-le moi savoir.

Autres conseils

Vous pouvez également essayer l’approche suivante. Je le trouve très élégant, car il ne nécessite pas de stocker une liste des valeurs de propriété disponibles dans l'objet. Par exemple, vous pouvez afficher un ensemble de valeurs sur un formulaire et un autre sur un autre.

  1. Créer une interface IYourDataProviderService.
  2. Créez une implémentation de IYourDataProviderService, qui connaît les données concrètes à fournir.
  3. Créez une classe implémentant ISite. Dans la méthode GetService (), renvoyez une instance de la classe qui implémente IYourDataProviderService, si le paramètre serviceType est typeof (IYourDataProviderService). J'ai laissé le reste des méthodes ISite en lançant NotImplementedException (sauf la propriété DesignMode) et cela a fonctionné pour moi, mais ce n'est probablement pas une solution idéale.
  4. Dans "Load", le gestionnaire d'événements attribue votre implémentation à la propriété Site de votre propertygrid.
  5. Profitez!
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top