Pregunta

Mi escenario es el siguiente:

Estoy trabajando en una aplicación de winforms en C # que tiene un botón dentro de la página principal de un control de tabulación que generará otra pestaña cada vez que se haga clic. Cada nueva página de pestañas contendrá un diseño definido por un control de usuario.

Mis preguntas son:

  1. ¿Cómo puedo permitir que el usuario cierre una de las pestañas que se crearon dinámicamente en tiempo de ejecución?

  2. ¿Cómo puedo modificar el control de tabulación para que tenga una pequeña 'X' en cada pestaña en la que el usuario pueda hacer clic para cerrar esa pestaña en particular? (Al igual que Firefox)

  3. ¿Cómo puedo exponer la propiedad SelectedIndex del control de tabulación al control de usuario si deseo cerrar la pestaña con un botón dentro del control de usuario?

¿Fue útil?

Solución

Creé un control de pestaña derivado hace aproximadamente un año. No voy a publicar la fuente aquí, porque tiene aproximadamente 700 líneas y está bastante desordenada. Tal vez encuentre algo de tiempo para limpiar el código y luego liberarlo aquí. Por ahora describiré brevemente la forma en que se construye.

Cada página de la pestaña tiene un ícono 'X' a la izquierda del título y las páginas de la pestaña admiten el reordenamiento mediante arrastrar y soltar y moverlas entre el control de varias pestañas.

Elijo la forma fácil de obtener el icono en las páginas de la pestaña. El control de pestaña tiene la TabControl.ImageList y una página de pestaña tiene una TabPage.ImageIndex . Así que acabo de agregar tres iconos a una lista de imágenes: normal, desplazar, presionar y procesar los eventos del mouse.

Con TabControl.GetTabRect ( ) puede probar si el mouse está sobre una pestaña específica y con algunas matemáticas se encuentra si está sobre el ícono. Luego, solo tiene que cambiar el ícono según el estado del botón del mouse y, finalmente, eliminar la página de pestaña debajo del mouse si se presiona el botón.

El principal problema con esta solución es que el cálculo de si el mouse está sobre el ícono requiere saber dónde está pintado el ícono en relación con la página de la pestaña y esto podría cambiar con una nueva versión de Windows. Y el icono está a la izquierda del título, pero eso no se ve tan mal.

Otros consejos

Encontré este código y fue muy útil para mí:

private void tabControl_MouseUp(object sender, MouseEventArgs e)
{
    // check if the right mouse button was pressed
    if(e.Button == MouseButtons.Right)
    {
        // iterate through all the tab pages
        for(int i = 0; i < tabControl1.TabCount; i++)
        {
            // get their rectangle area and check if it contains the mouse cursor
            Rectangle r = tabControl1.GetTabRect(i);
            if (r.Contains(e.Location))
            {
                // show the context menu here
                System.Diagnostics.Debug.WriteLine("TabPressed: " + i);
             }
        }
    }
}

TabControl: Cómo capturar el botón derecho del mouse En la pestaña

Hice lo siguiente: en la etapa de crear (agregar) TabPage , agregué un toolStrip

ToolStrip ts = new ToolStrip();
ts.Dock = DockStyle.Top;
ts.RightToLeft = System.Windows.Forms.RightToLeft.Yes;

Luego, crea el botón X y agrégalo a toolstrip

ToolStripButton ToolStripButton = new ToolStripButton("X");
ts.Items.Add(ToolStripButton);

cree un evento haciendo clic en el botón X

ToolStripButton.Click += new EventHandler(ToolStripButton_Click);

agregue toolstrip a tabpage

tabControl1.TabPages[curenttabpage].Controls.Add(ts);

ahora para el ToolStripButton_Click es el siguiente:

void ToolStripButton_Click(object sender, EventArgs e)
{ 
 ToolStripButton t = (ToolStripButton)(sender);
 ToolStrip ts = t.Owner;
 TabPage tb = (TabPage)
 (ts.Parent);tabControl1.TabPages.Remove(tb);
}

Tal vez no sea como quieres, pero funcionará bien.

Creé una configuración que es similar.

Cada control que se agrega a la página de la pestaña en el tiempo de ejecución se deriva de un control base especial que creé. Este control base tiene un botón de cierre (junto con algunas otras características, como la opción de seguro para cerrar).

Cerrar el código de la pestaña que estoy usando en mi control base:

 TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;

tabControl.TabPages.Remove(parent);

Sé que este es un tema antiguo, pero encontré este enlace eso te permitirá " ocultar " las pestañas de una matriz y, a continuación, puede volver a cargar las pestañas que desee en el tiempo de ejecución. Agregué esto más para un lugar donde pueda encontrarlo fácilmente nuevamente.

Este código puede ayudar a cerrar los controles de pestañas con el botón central del mouse:

            private void tabControl1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button != System.Windows.Forms.MouseButtons.Middle)
                    return;

                for (int i = 0; i < MainTabControl.TabPages.Count; i++)
                {
                    if (this.MainTabControl.GetTabRect(i).Contains(e.Location))
                    {
                        this.MainTabControl.TabPages.RemoveAt(i);
                        return;
                    }
                }
            }

¡Funciona!

TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(tabpage);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top