studio - windows forms c# tutorial
Aplicación de Windows C#.NET con múltiples vistas (5)
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).
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 cambiar entre las vistas? Desde el comienzo hasta la ejecución? Entre las vistas en ejecución?
Ideas:
- Usa un formulario y oculta y muestra los controles
- Utilice un formulario de inicio y luego un formulario con un TabControl
- Usa seis formularios separados
El método que uso a menudo es preconfigurar todos mis controles en controles individuales del "Panel" y luego mostrar y esconder estos paneles cuando los necesito.
En lugar de hacer que cada vista de un panel dentro de un solo formulario, pueda hacer que cada vista sea un UserControl. 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.
Los formularios con pestañas generalmente son buenos ... pero solo si desea que el usuario pueda ver cualquier vista en cualquier momento ... y parece que no.
Los formularios independientes definitivamente funcionan, pero debes asegurarte de que el cambio sea inmejorable ... si te aseguras de que el nuevo formulario tenga el mismo tamaño y la misma ubicación que el anterior, se verá igual para los controles que cambian.
El método que uso a menudo es preconfigurar todos mis controles en controles individuales del "Panel" y luego mostrar y esconder 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.
Crear un grupo de paneles superpuestos es una pesadilla en tiempo de diseño.
Sugeriría usar un control de pestaña con cada "vista" en una pestaña separada, y luego elegir la pestaña correcta en tiempo de ejecución. Puedes evitar mostrar los encabezados de las pestañas si colocas algo como esto en el evento Load de tu 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));
Lo que hago es tener un Panel donde sus diferentes vistas se ubicarán en el formulario principal. luego crea controles de usuario para tus diferentes vistas.
Luego, cuando quiero cambiar entre una ''vista'', la acoplo al Panel en el formulario principal ... el código se ve un poco así.
prefiero esto porque puedes volver a usar tus vistas, por ejemplo, si deseas abrir una vista en una pestaña, puedes acoplar tus controles de usuario dentro de las pestañas ... o incluso heredar de tabpage en lugar de usercontrol para hacer las cosas un poco más genéricas
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;
}
}
También verificaría la Guía de aplicaciones compuestas para WPF o Smart Client Software Factory