Normalmente uso un TabControl
y oculto las pestañas de alguna manera y navego por ellas.¿Buenos patrones para construir un asistente?
¡Tengo curiosidad sobre otras formas de hacer esto!
Normalmente uso un TabControl
y oculto las pestañas de alguna manera y navego por ellas.¿Buenos patrones para construir un asistente?
¡Tengo curiosidad sobre otras formas de hacer esto!
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.
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:
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:
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.
Sauron usó un dispositivo 'RingControl' para asistentes, pero creo que fue demasiado. – FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner: ¿dónde puedo obtener ese control? – Luiscencio