2009-10-20 11 views
6

Pregunta extraña, pero que me desconcierta un poco. En los viejos tiempos cuando teníamos Terminales y DOS, las aplicaciones generalmente solo tenían una "ventana", y eso era una pantalla completa. Cuando las personas cambiaban de funciones, no existía el concepto de abrir una nueva ventana, sino que se sobrescribía el contenido de la ventana principal. Entonces, solo había una ventana principal, pero múltiples pantallas que se representaban en ella.Implementación de pantallas múltiples en una aplicación

¿Cómo se podría crear algo así en una aplicación moderna, ya sea WinForms o WPF?

Parece que hay dos enfoques:

  • tiene varias ventanas. Este es el enfoque habitual y, por lo general, tiene sentido permitir que el usuario trabaje con varias ventanas al mismo tiempo, pero esto puede no ser necesario o no necesario. Usar ShowDialog() en lugar de Show() es la forma habitual de crear el segundo Window Modal.
  • Tiene solo una ventana, pero con un TabControl en ella. Ocultar las pestañas y cambiarlas programáticamente. Esto es parecido al comportamiento de "Una ventana, pantallas múltiples", pero naturalmente se vuelve complicado ya que tiene todos los controles en la misma clase de Formulario (aunque se podría argumentar que esto obliga a nombrar correctamente los controles. Además, se podría recomendar su uso clases parciales y una .cs por pantalla)

Me pregunto si hay una manera mejor? Esencialmente, algo que dice "Mira, no me importan cosas como el estilo de borde/iconos o la tira del menú principal. Lo único que quiero es que visualices esta pantalla en esta área". Algo parecido a las páginas maestras de ASP.net, donde las páginas reales solo definen el contenido que se representa en Placeholders.

¿Hay algún mecanismo adecuado para hacer algo como eso?

¿O hay algún problema con todo el enfoque?

Respuesta

7

Un enfoque sería implementar cada pantalla como control de usuario y cargar y descargar dinámicamente estos controles en la ventana principal según sea necesario. He utilizado ese enfoque en una aplicación móvil de Windows y ha funcionado bastante bien.

+1

+1; Estaba escribiendo una variación de esta respuesta. ¡Ahora no tengo que hacerlo! –

+0

Esa es una gran idea, especialmente porque los controles de usuario pueden colocarse en otros contenedores 8 como un panel), lo que hace que la administración sea sencilla. –

1

No he oído hablar de un marco específico para lograr eso, pero haría cada página un UserControl, o posiblemente una subclase de un control con la lógica de representación deseada. Estos controles de página serían todos miembros del formulario y se agregarían a su colección de Controles según sea necesario (o si hay demasiados, se crearán según sea necesario). Tendrían propiedades como Dock = DockStyle.Fill establecidas en la inicialización. Cuando las páginas cambiantes:

void ChangePage(object sender, EventArgs e) 
{ 
    Controls.Clear(); 
    Controls.Add(sender as Control); 
}
3

Teniendo en cuenta que usted ha mencionado WPF, vale la pena mencionar que Prism (el marco de interfaz de usuario compuesta de MPP) implementaría que el uso de múltiples vistas (UserControls) ya sea dentro de un único controlador (para el mismo agregado general) o múltiples Controladores (en varios agregados).

Tanto la vista como su presentador pueden activar un comando (o transmitir un evento a través de IEventAggregator) y su controlador de navegación puede responder cambiando la vista actual asignada a la "región" apropiada (es posible que solo tenga una). De hecho, el modelo de región de Prism es bastante similar al modelo de MasterPage/Placeholder, por lo que es posible que desee analizarlo.

Prism también puede incluir el seguimiento del historial de navegación (atrás/adelante), pero no lo he usado si lo hace.

1

Trabajo como desarrollador de C# y puedo decirle que paso a paso empiezo a usar UserControl para múltiples pantallas (páginas) de aplicaciones. Construyo mi clase base para una página, llamada BasePage que extiende UserControl y la extiendo para cada página que necesito (MainPage, SettingsPage, etc.). En MainForm (la única forma de la aplicación) he agregado un Control de BasePage (por ejemplo, llamado CurrentPage) donde puedo cargar la página necesaria. desde MainForm envío eventos necesarios a CurrentPage. Creo que esta es la mejor solución para este tipo de aplicación en la que necesita múltiples formularios en una sola forma. Esta es la estructura que uso para todas mis aplicaciones de múltiples páginas.

Si usa el control de pestañas terminará estrangulando su formulario con todos los controles de todas las pestañas cargadas al mismo tiempo. Vi proyectos con más de 10 pestañas, aplicaciones muy complejas que son muy lentas y difíciles de codificar.

Espero que esta respuesta te sea útil!

Cuestiones relacionadas