Pregunta

Actualmente espero usar un PropertyGrid para permitir a los usuarios editar algunas de mis clases, sin embargo, he golpeado una pared 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 desea usar una textura que la aplicación aún no ha cargado, puede hacer clic en un botón para elegir una de un diálogo de archivo. En caso de que no tenga sentido aquí, una simulación de la forma:

Imagen desplegable.

Mi problema: para llenar el cuadro de lista necesito acceso 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 clases que no he escrito, como la clase XNA Texture2D.

Estas son las clases que estoy 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; }
    ....
}

He estado mirando mis opciones y parecen ser:

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

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

  1. Haga que las clases de gestión sean singletons.

Realmente tampoco quiero hacer esto. Parece una forma rápida y sucia de `` esconderse '' el problema en lugar de "resolver" eso. También podría querer la opción de tener varias clases de gestión en el futuro que los singletons eliminen.

  1. Cree una clase de contenedor que contenga la referencia a una clase de gestión y su objetivo (como XNA Texture2D).

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

¿Alguna idea sobre lo anterior u otros métodos para pasar lo que necesito al UITypeEditor?

Gracias por leer.

¿Fue útil?

Solución

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. Podría probar si el contexto. La instancia es ITextureProvider, por ejemplo, luego emitirlo y acceder a las texturas. No estoy seguro de si esto tiene sentido en su diseño, pero hágamelo saber.

Otros consejos

Como alternativa, puede probar el siguiente enfoque. Me parece muy elegante, porque no requiere almacenar una lista de valores de propiedad 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. Crear una clase implementando 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 'Cargar', asigne su implementación a la propiedad del sitio de su grid de propiedad.
  5. ¡Disfruta!
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top