2009-06-18 17 views
5

Actualmente estoy esperando usar un PropertyGrid para permitir a los usuarios editar algunas de mis clases, sin embargo, he topado con objetos que pasan al UITypeEditor (s) que usan. Cuando el usuario presiona el menú desplegable, quiero mostrar un cuadro de lista de texturas ya cargadas para elegir, si quieren usar una textura, la aplicación no se ha cargado aún, pueden hacer clic en un botón para elegir una de un cuadro de diálogo de archivo. En caso de que no tenga sentido aquí un simulacro de la forma:Pasando objetos a un UITypeEditor

Dropdown Image.

Mi problema: Para completar el cuadro de lista, necesito acceder a la clase que gestiona la lista de recursos del UITypeEditor.

Ahora he resuelto este problema para mis propias clases dándoles una referencia sobre la creación de su objeto de gestión. En el UITypeEditor, uso esa referencia para acceder a lo que necesito. Sin embargo, no puedo hacer esto para las clases que no he escrito, como la clase XNA Texture2D.

Éstos son lo que las clases que estoy usando el siguiente aspecto:

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

He estado buscando en mis opciones y que parecen ser:

  1. Hacer las clases de gestión estática.

Realmente no quiero hacer esto. Hay varias clases de administración ya que cada recurso se carga de manera diferente. También hay clases que deben crearse antes de estas y que se transfieren.

  1. Realice las clases de administración de singletons.

Realmente no quiero hacer esto tampoco. Parece una manera rápida y sucia de "esconder" el problema en lugar de "resolverlo". También podría querer la opción de tener varias clases de administración en el futuro que eliminen los singletons.

  1. Crea una clase contenedora que contiene la referencia a una clase de gestión y su destino (como XNA Texture2D).

Esto es lo que estoy pensando en hacer. Sería bastante simple y rápido de hacer, pero algo me molesta, pero no sé qué.

¿Alguna idea sobre los métodos anteriores u otros para pasar lo que necesito en el UITypeEditor?

Gracias por leer.

Respuesta

9

En el método EditValue, se le da un contexto. Use context.Instance para acceder al objeto que contiene su propiedad. Este objeto también debe contener una propiedad que le dé acceso a la lista de cosas que desea mostrar. Puede probar si context.Instance es ITextureProvider, por ejemplo, luego echarlo y acceder a las texturas. No estoy seguro de si esto tiene sentido en su diseño, pero avíseme.

+0

Mi diseño actual es el siguiente: MaterialDatabase: Contiene un diccionario de materiales que contengan las clases Texture2D. GeometryDatabase: contiene un diccionario de StaticGeometryChunks que contienen GeometryData. TileDatabase: contiene un diccionario de mosaicos que contiene StaticGeometryChunk y un material. Cuando se crean estas clases, se pasan a una vista de árbol para mostrar lo que han cargado, es una selección en la vista de árbol que activa la cuadrícula de propiedad para ver la etiqueta de nodos (una referencia al objeto de diccionario). Tengo la sensación de que esto significa que el contexto será la vista de árbol? – Kath

+0

Lo siento, mi formateo ha desaparecido arriba y me quedé sin caracteres. Gracias por la respuesta. La principal clase general es el Azulejo, usan los otros dos objetos (Materiales/Geometría) para sus datos. Esto es para que si un usuario cambia una textura en un material, todos los mosaicos que usan ese material obtengan el cambio también. ¿Podría un ligero rediseño de esta configuración hacer que sea más fácil? – Kath

+0

context.Instance es el propietario de la propiedad. En tu caso, sería material. Entonces, esta clase de Material debería poder acceder a las posibles texturas. –

4

Como alternativa puede probar el siguiente enfoque. Lo encuentro muy elegante, porque no requiere almacenar una lista de valores de propiedades disponibles en el objeto. Por lo tanto, por ejemplo, puede mostrar un conjunto de valores en un formulario y otro conjunto en otro.

  1. Cree una interfaz IYourDataProviderService.
  2. Cree una implementación de IYourDataProviderService, que conoce los datos concretos que debe proporcionar.
  3. Crea una clase que implementa ISite. En el método GetService() devuelve una instancia de clase que implementa IYourDataProviderService, si el parámetro serviceType es typeof (IYourDataProviderService). Dejé el resto de los métodos ISite lanzando NotImplementedException (excepto la propiedad DesignMode) y para mí funcionó, pero probablemente esta no sea una solución ideal.
  4. En el controlador de eventos 'Load' asigne su implementación a la propiedad del sitio de su propertygrid.
  5. ¡Disfrútalo!