2008-08-24 11 views
9

Estoy reescribiendo una aplicación antigua y la utilizo como una buena oportunidad para probar el desarrollo de C# y .NET (suelo hacer muchas cosas de plug-in en C).Building C# .NET aplicación de Windows con múltiples vistas

La aplicación es básicamente un temporizador que recopila datos. Tiene una vista de inicio con un botón para iniciar la medición. Durante la medición, la aplicación tiene cinco vistas diferentes según la información que el usuario quiera ver.

¿Cuál es la mejor práctica para alternar entre las vistas? ¿Desde el comienzo hasta la ejecución? ¿Entre las vistas en ejecución?

Ideas:

  • Uso de una forma y mostrar u ocultar los controles
  • utilizar un formulario de inicio y luego un formulario con un TabControl
  • Uso seis formas separadas

Respuesta

7

Crear un montón de paneles superpuestos es una pesadilla en el tiempo de diseño.

Sugiero usar un control de pestañas con cada "vista" en una pestaña separada, y luego elegir la pestaña correcta en el tiempo de ejecución. Puede evitar que se muestre la ficha Encabezados por poner algo como esto en el evento Load del formulario:

tabControl1.Top = tabControl1.Top - tabControl1.ItemSize.Height; 
tabControl1.Height = tabControl1.Height + tabControl1.ItemSize.Height; 
tabControl1.Region = new Region(new RectangleF(tabPage1.Left, tabPage1.Top, tabPage1.Width, tabPage1.Height + tabControl1.ItemSize.Height)); 
+0

Si el tabcontrol es 'llenar' atracado dentro de otro contenedor, y si cambia el tamaño de ese contenedor, la tarjeta de registro ya no llenan los muelles al contenedor principal si se utiliza el código de seguridad. Solo para tu información. Gracias – SomethingBetter

3

formas con fichas generalmente bueno ... pero solo si desea que el usuario pueda ver cualquier vista en cualquier momento ... y parece que no.

Los formularios independientes definitivamente funcionan, pero debe asegurarse de que el cambio sea inmejorable ... si se asegura de que el nuevo formulario tenga el mismo tamaño y la misma ubicación que el anterior, se verá igual para el mismo con cambios de controles.

El método que uso a menudo es preinstalar todos mis controles en controles "Panel" individuales y luego mostrar y ocultar estos paneles cuando los necesito. El control "Panel" es básicamente un contenedor de control ... puede mover el panel y todos los controles sobre él se mueven de forma relativa. Y si muestra u oculta el panel, los controles sobre él hacen lo mismo. Son geniales para situaciones como esta.

1

El método que utilizo a menudo es en realidad para pre-configuración de todos mis controles de controles individuales "panel" y luego mostrar y ocultar estos paneles, ya que necesito ellos.

En lugar de hacer cada vista de un panel dentro de una única forma que podría hacer cada vista un control de usuario. Luego, cree un formulario único y escriba un código para crear y mostrar el UserControl correcto en el Formulario y para pasar de uno a otro. Esto sería más fácil de mantener porque tendrá una clase separada para cada vista en lugar de una única clase de formulario con 6 paneles, cada uno con sus propios controles, lo que parece difícil y propenso a errores de mantener.

7

Lo que hago es tener un panel en sus diferentes puntos de vista serán sentarse en el formulario principal. luego crea controles de usuario para tus diferentes vistas.

Entonces cuando quiero cambiar entre a'view' de acoplarlo al panel en el formulario principal .. código parece un poco a esto.

i preffer esto porque se puede reusar sus puntos de vista, como si quiere abrir una vista en una pestaña que se puede acoplar a sus controles de usuario dentro de las páginas de la ficha .. o incluso heredar de TabPage en lugar de control de usuario para hacer las cosas un poco más genérico

public partial class MainForm : Form 
{ 
    public enum FormViews 
    { 
     A, B 
    } 
    private MyViewA viewA; //user control with view a on it 
    private MyViewB viewB; //user control with view b on it 

    private FormViews _formView; 
    public FormViews FormView 
    { 
     get 
     { 
      return _formView; 
     } 
     set 
     { 
      _formView = value; 
      OnFormViewChanged(_formView); 
     } 
    } 
    protected virtual void OnFormViewChanged(FormViews view) 
    { 
     //contentPanel is just a System.Windows.Forms.Panel docked to fill the form 
     switch (view) 
     { 
      case FormViews.A: 
       if (viewA != null) viewA = new MyViewA(); 
       //extension method, you could use a static function. 
       this.contentPanel.DockControl(viewA); 
       break; 
      case FormViews.B: 
       if (viewB != null) viewB = new MyViewB(); 
       this.contentPanel.DockControl(viewB); 
       break; 
     } 
    } 

    public MainForm() 
    { 

     InitializeComponent(); 
     FormView = FormViews.A; //simply change views like this 
    } 
} 

public static class PanelExtensions 
{ 
    public static void DockControl(this Panel thisControl, Control controlToDock) 
    { 
     thisControl.Controls.Clear(); 
     thisControl.Controls.Add(controlToDock); 
     controlToDock.Dock = DockStyle.Fill; 
    } 
} 
Cuestiones relacionadas