2010-02-26 19 views

Respuesta

1

Usted necesita para crear su propia para satisfacer sus propias preferencias. Un consejo será que cree una forma base llamada "frmWizard", entonces todas las ventanas del asistente heredarán de ella. Debería poner objetos comunes u objetos de asistente en la clase base y modificar \ anularlos en la clase derivada si fuera necesario.

+1

Es útil combinar la forma de base (sugerido aquí) + control de ficha personalizada (descrito en otras respuestas). La creación de bases para asistentes es útil especialmente cuando la aplicación tiene más de un asistente. Ayuda a evitar el horror de codificación de copiar y pegar. – miroxlav

+0

Los métodos útiles que normalmente implemento en la clase base son .. 'OnPageEntered',' OnPageExited', 'AllowNext',' AllowBack', etc. – KDecker

126

Muchas formas de hacerlo. Crear un formulario para cada paso del asistente es posible, pero muy incómodo. Y feo, muchos parpadeos cuando el usuario cambia el paso. Al hacer que cada paso de un UserControl pueda funcionar, simplemente los cambia dentro y fuera de la colección Controls del formulario. O haga que uno de ellos sea visible = verdadero para cada paso. Sin embargo, el diseño de UC tiende a complicarse, debe agregar propiedades públicas para cada elemento de UI.

La manera fácil y RAD es usar un TabControl. Funciona muy bien en el diseñador ya que le permite cambiar las pestañas en el momento del diseño y soltar los controles en cada pestaña. Cambiar los pasos es trivial, simplemente cambie la propiedad SelectedIndex. Lo único que no es trivial es ocultar las pestañas en tiempo de ejecución. Todavía es fácil hacerlo procesando un mensaje de Windows. Agregue una nueva clase a su formulario y pegue el código que se muestra a continuación. Compilar. Coloque el nuevo control desde la parte superior de la caja de herramientas en su formulario.

using System; 
using System.Windows.Forms; 

class WizardPages : TabControl { 
    protected override void WndProc(ref Message m) { 
    // Hide tabs by trapping the TCM_ADJUSTRECT message 
    if (m.Msg == 0x1328 && !DesignMode) m.Result = (IntPtr)1; 
    else base.WndProc(ref m); 
    } 
} 
+4

+51: así que ahora puedes usar un control de pestañas, ocultando las pestañas .. .y cambiar entre las páginas de pestañas con el índice de pestañas ... ??? Usaré esto ... mucho mejor que administrar paneles superpuestos. – IAbstract

+0

@ Hans Buena respuesta Hans! Solo estoy courius: ¿esto oculta por completo las pestañas para que el usuario no pueda hacer clic o las active con la tecla TAB de hittink o algo así? –

+0

@ Sean87 presionando CTRL + TAB en realidad se mueve a través de las pestañas – ccalboni

29
class WizardPages : TabControl 
{ 
    protected override void WndProc(ref Message m) 
    { 
     // Hide tabs by trapping the TCM_ADJUSTRECT message 
     if (m.Msg == 0x1328 && !DesignMode) m.Result = (IntPtr)1; 
     else base.WndProc(ref m); 
    }   

    protected override void OnKeyDown(KeyEventArgs ke) 
    { 
     // Block Ctrl+Tab and Ctrl+Shift+Tab hotkeys 
     if (ke.Control && ke.KeyCode == Keys.Tab) 
      return; 
     base.OnKeyDown(ke); 
    } 
} 
+0

¿Qué pasa con otras llaves? PageUp y PageDown? O teclas de flecha izquierda y derecha? No puede agregarlos porque no podrá mover dentro del cuadro de texto que es hijo de ese control. – Misiu

+0

Si maneja 'Ctrl' +' Tab' y 'Ctrl' +' Shift' + 'Tab' no olvide también sus equivalentes' Ctrl' + 'PgUp' y' Ctrl' + 'PgDn'. Estos últimos son más dominantes en muchos escenarios donde 'Ctrl' +' Tab' y 'Ctrl' +' Shift' + 'Tab' son tomados por control interno, p. caja de entrada multilínea. – miroxlav

+0

@Misiu claves restringidas arriba todavía funcionan bien en controles secundarios (Acabo de probar eso) – miroxlav

Cuestiones relacionadas