2010-03-19 9 views

Respuesta

5

Puede usar una colección de objetos Panel, con todos menos el primer panel teniendo su propiedad Visible establecida en false.

Almacene el índice del panel actual, y tenga los botones "Siguiente" y "Anterior" que cambien este índice apropiadamente. Cuando se cambia este índice, haga que los paneles apropiados sean visibles/no visibles según sea necesario (solo el panel actual debería estar visible en un momento determinado).

También puede manejar el evento IsVisibleChanged en algunos/todos sus paneles, para activar ciertos comportamientos cuando el usuario navega a un panel en particular.

2

Este es un tema bastante complicado; Construí un control Wizard bastante completo hace dos años para usarlo en casa y recuerdo que tardó varias semanas en funcionar correctamente.

Los elementos básicos son:

  • del panel de encabezado
  • panel Contenido
  • panel de Acción
  • barra lateral

Tanto el panel de contenidos y el panel de acción hacen uso de la ParentControlDesigner a permite soltar controles El panel de contenido no te deja caer directamente sobre él, sino que te permite colocarlo en la página activa (subpanel). El panel de acciones también tiene un modo "predeterminado" en el que crea los 4 botones estándar (anterior, siguiente, cancelar, finalizar). Principalmente implementé el modo personalizado para poder despellejarlo, es decir, usando los botones DevEx en lugar de los botones estándares de Winforms.

El encabezado es básicamente estático, es PictureBox y Label con la imagen, el texto y la fuente personalizables. (De manera predeterminada, el texto es el mismo que el título de la página y la fuente es la fuente del control con el estilo en negrita agregado).

Entonces hay un conjunto de estructuras de datos expuestos por la API:

  • Pasos (con nombre, título, etc., también especifican si son o no deben estar vinculados en la barra lateral)
  • flujos de trabajo (es decir, cuando te llevan a la próxima basada en sus opciones)
  • eventos de validación (tanto sincrónicas y asincrónicas)
  • acciones (que se ejecuten antes/después del cambio de página, clics de botón, etc.)
  • Transición efec ts (hice esto por diversión, usuarios como 'em)

Armado un editor de colecciones personalizadas para los pasos, que a su vez crean subpaneles para el panel de contenido como se explicó anteriormente. Cada panel se acaba de agregar directamente a la colección de control, pero solo uno es visible a la vez según la propiedad del paso activo. Recuerdo que el acoplamiento nunca parecía funcionar del todo bien, así que tuve que anular todos los métodos de cambio de tamaño.Nunca logré crear una etiqueta inteligente para alternar fácilmente entre las páginas, pero la página activa (o el índice de página) se puede elegir en la cuadrícula de propiedades.

Luego también tuve que incluir un montón de ganchos para insertar cualquier lógica personalizada en páginas individuales. Es difícil entrar en muchos detalles aquí sin publicar todo el código.

Me costó bastante tiempo diseñar y probar correctamente, pero no recuerdo haber utilizado ningún truco de diseño whizbang, simplemente tuve que abordar el problema metódicamente, como se mencionó, desde la perspectiva de los elementos de IU individuales (tanto en tiempo de ejecución como tiempo de diseño) y estructuras de datos y cómo interactúan.

Tenga en cuenta que todo esto fue con el propósito de crear un componente de asistente reutilizable porque necesitábamos desarrollar aproximadamente 10 de ellos para una aplicación en particular (y también es útil para otros proyectos). Si tan solo tuviera que hackear un asistente rápido, probablemente no pasaría por todo este problema, solo haría lo que está haciendo: use un control de pestañas y algunos paneles de flujo. O mejor aún, usaría un control de asistente listo para usar, como están disponibles ahora en muchas bibliotecas de Winforms, como la biblioteca DX.

Cuestiones relacionadas