ventanas - como cerrar todos los formularios en c#
Personalización de un control de pestañas para el cierre de pestañas individuales (7)
Mi escenario es el siguiente:
Estoy trabajando en una aplicación winforms en C # que tiene un botón dentro de la página principal de un control de tabulación que generará otra página de pestañas cada vez que se haga clic. Cada nueva pestaña contendrá un diseño definido por un control de usuario.
Mis preguntas son:
¿Cómo puedo permitir que el usuario cierre una de las pestañas que se crearon dinámicamente en tiempo de ejecución?
¿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 tiene)
¿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?
¡Funciona!
TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(tabpage);
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 icono ''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 propiedad TabControl.ImageList
y una página de pestaña tiene una propiedad 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()
puedes probar si el mouse está sobre una pestaña específica y con algunos cálculos que encuentras 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 la 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.
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 mouse, haga clic con el botón derecho en la pestaña
Este código puede ayudar a cerrar los controles de la pestaña 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;
}
}
}
He creado una configuración que es similar.
Cada control que se agrega a la página de pestañas en 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);
Hice lo siguiente: en la etapa 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 toolstrip
a la toolstrip
de toolstrip
ToolStripButton ToolStripButton = new ToolStripButton("X");
ts.Items.Add(ToolStripButton);
crear un evento haciendo clic en el botón X
ToolStripButton.Click += new EventHandler(ToolStripButton_Click);
añadir tabpage
toolstrip
a la 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 lo que quieres, pero funcionará bien.
Sé que este es un hilo antiguo, pero encontré este link que le permitirá "ocultar" las pestañas en una matriz y luego puede volver a cargar las pestañas que desea en el tiempo de ejecución. Agregué esto más para un lugar donde pueda encontrarlo fácilmente otra vez.