2012-03-02 66 views
6

Tengo una aplicación WinForm de C# que necesito para generar TabPages en tiempo de ejecución. Idealmente, me gustaría diseñar estos tabuladores utilizando el diseñador de VS, pero parece que no puedo hacerlo directamente, ya que no puedo arrastrarlo y soltarlo desde la caja de herramientas (¿hay alguna otra manera?).¿Diseño TabPage personalizado en C# WinForms?

Tengo dos tabulaciones genéricas que voy a utilizar varias veces. Uno que contiene una hoja de cálculo simple y un par de cuadros de texto y otro con un gráfico y un par de cuadros de texto. Estas páginas eventualmente se volverán más complicadas. Estoy buscando el mejor método para hacer esto. Actualmente solo estoy creando clases personalizadas para cada página de pestañas y configurándolas como una clase base de TabPage. Por ejemplo:

public partial class SpreadsheetTabPage : TabPage{} 

leí que los controles de usuario ofrecen algún tipo de alternativa, pero no entienden realmente las ventajas de su uso frente a mi método.

Para que quede claro, quiero saber cuál es el mejor enfoque para desarrollar estos tabuladores personalizados y por qué. Proporcione un ejemplo de código básico si es relevante. Mi método realmente no está causando demasiados problemas, pero veo que agregar cosas a estas páginas más adelante será difícil, particularmente sin el uso del diseñador.

Gracias por su ayuda con anticipación!

+0

En la ventana Propiedades de su TabControl hay una propiedad de TabPages donde puede agregar cualquier tabulación que desee – Steve

+0

Puede agregarle un tabcontrol y tabulaciones, pero en realidad no mirar su diseño. Eso no sería diferente a solo codificar en su propia clase y configurar las propiedades manualmente como se muestra arriba. – ImGreg

Respuesta

3

Si hace un control de usuario que contenga su tabcontrol puede ver al diseñador y diseñarlo como desee, y puede agregar un código adicional, y aún así puede arrastrarlo & soltarlo de la caja de herramientas para usarlo.

Nota: que no se puede ver el control del usuario (ni la clase codificado manualmente) hasta que usted Reconstruir su proyecto

+1

Parecía tener la idea correcta.He hecho esto ligeramente diferente, pero le daré crédito por la respuesta. Realicé un control de usuario personalizado y lo agregué a los tabuladores de forma manual. Gracias por la nota, también me salvó un poco de google :) – ImGreg

+0

+1, eres bienvenido –

6

Usted puede crear su propio diseñador TabControl, e implementar la funcionalidad que necesita en el diseño hora. Aquí está el código de la versión más simple de tales diseñador:

using System; 
using System.Drawing; 
using System.Collections; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 
using System.ComponentModel.Design; 
using CustomTabControlExample.TabControl; 

namespace CustomTabControlExample.Design { 
    public class CustomTabControlDesigner :ParentControlDesigner { 
     DesignerVerbCollection fVerbs; 
     public override DesignerVerbCollection Verbs { 
      get { 
       if (fVerbs == null) 
        fVerbs = new DesignerVerbCollection(new DesignerVerb[] { 
         new DesignerVerb("Add Tab", OnAdd) 
         }); 
       return fVerbs; 
      } 
     } 

     void OnAdd(object sender, EventArgs e) { 
      TabPage newPage = (TabPage)((IDesignerHost)GetService(typeof(IDesignerHost))).CreateComponent(
       typeof(CustomTabPage)); 
      newPage.Text = newPage.Name; 
      ((System.Windows.Forms.TabControl)Component).TabPages.Add(newPage); 
     } 

     public override void InitializeNewComponent(IDictionary defaultValues) { 
      base.InitializeNewComponent(defaultValues); 
      for (int i = 0; i < 2; i++) 
       OnAdd(this, EventArgs.Empty); 
     } 

     protected override void WndProc(ref Message m) { 
      base.WndProc(ref m); 
      // Selection of tabs via mouse 
      if (m.Msg == 0x201/*WM_LBUTTONDOWN*/) { 
       System.Windows.Forms.TabControl control = (System.Windows.Forms.TabControl)Component; 
       int lParam = m.LParam.ToInt32(); 
       Point hitPoint = new Point(lParam & 0xffff, lParam >> 0x10); 
       if (Control.FromHandle(m.HWnd) == null) // Navigation 
        if (hitPoint.X < 18 && control.SelectedIndex > 0) // Left 
         control.SelectedIndex--; 
        else control.SelectedIndex++; // Right 
       else // Header click 
        for (int i = 0; i < control.TabCount; i++) 
         if (control.GetTabRect(i).Contains(hitPoint)) { 
          control.SelectedIndex = i; 
          return; 
         } 
      } 
     } 

     protected override void OnDragDrop(DragEventArgs de) { 
      ((IDropTarget)((System.Windows.Forms.TabControl)Component).SelectedTab).OnDragDrop(de); 
     } 

     protected override void OnDragEnter(DragEventArgs de) { 
      ((IDropTarget)((System.Windows.Forms.TabControl)Component).SelectedTab).OnDragEnter(de); 
     } 

     protected override void OnDragLeave(EventArgs e) { 
      ((IDropTarget)((System.Windows.Forms.TabControl)Component).SelectedTab).OnDragLeave(e); 
     } 

     protected override void OnDragOver(DragEventArgs de) { 
      ((IDropTarget)((System.Windows.Forms.TabControl)Component).SelectedTab).OnDragOver(de); 
     } 
    } 
} 

Esto parece una manera muy compleja, pero una vez que se aprende, usted quedará impresionado por capabilites de gran alcance que proporciona Visual Studio. Puede encontrar mucha información en MSDN. Aquí se describen las características más comunes: Enhancing Design-Time Support

2

Me encontré con este hilo con la misma pregunta en mente. Después de pensar sobre el problema, me di cuenta de que la solución me estaba mirando a la cara. En realidad es bastante básico y elegante.

Lo que hice fue creado un UserControl llamado TabPageLibrary. En consecuencia, arrastré un TabControl sobre él y agregó páginas en función de la configuración que quería. Luego configuro el modificador TabPage en interno. Cuando necesitaba una TabPage extendida específica, simplemente llamaba a la clase TabPageLibrary y obtengo la TabPage que necesito para una aplicación específica. Esto me dio la posibilidad de reutilizar un TabPage preconfigurada específica en toda la aplicación WinForm

private void PropertiesButton_Click(object sender, EventArgs e) 
{ 
TabPageLibrary library = new TabPageLibrary(); 
TabPage propertyPage = library.PropertyPage; 
this.tabControl.TabPages.Add(propertyPage); 
} 

Esto sin duda resuelto mi problema - tal vez va a trabajar para su aplicación.

+0

Esto fue increíblemente simple y funcionó muy bien! ¡Gracias! –

Cuestiones relacionadas