Domanda

Il mio scenario è il seguente:

Sto lavorando a un'applicazione winforms in C # che ha un pulsante all'interno della pagina principale di un tabcontrol che genererà un'altra tabpage ogni volta che viene cliccato. Ogni nuova scheda conterrà un layout definito da un controllo utente.

Le mie domande sono:

  1. Come posso consentire all'utente di chiudere una delle schede che sono state create in modo dinamico in fase di esecuzione?

  2. Come posso fare per modificare il tabcontrol stesso in modo che abbia una piccola 'X' in ogni scheda su cui l'utente può fare clic per chiudere quella particolare scheda? (Come Firefox ha)

  3. Come posso esporre la proprietà SelectedIndex del tabcontrol al controllo utente se invece voglio chiudere la scheda con un pulsante all'interno del controllo utente?

È stato utile?

Soluzione

Ho creato un controllo tab derivato circa un anno fa. Non pubblicherò qui la fonte, perché è lunga circa 700 righe e codificata piuttosto disordinata. Forse troverò del tempo per ripulire il codice e poi rilasciarlo qui. Per ora illustrerò brevemente il modo in cui è costruito.

Ogni scheda presenta un'icona 'X' a a sinistra del titolo e le pagine a schede supportano il riordino trascinandole e spostandole tra più controlli a schede.

Scelgo il modo più semplice per ottenere l'icona nelle schede. Il controllo della scheda ha il TabControl.ImageList e una scheda ha una TabPage.ImageIndex . Quindi ho appena aggiunto tre icone a un elenco di immagini: normale, hover, premuto - ed elabora gli eventi del mouse.

Con TabControl.GetTabRect ( ) puoi verificare se il mouse si trova su una scheda specifica e con alcuni calcoli scopri se si trova sopra l'icona. Quindi devi solo cambiare l'icona a seconda dello stato del pulsante del mouse ed eventualmente rimuovere la scheda sotto il mouse se il pulsante è stato premuto.

Il problema principale con questa soluzione è che per calcolare se il mouse si trova sopra l'icona è necessario sapere dove è dipinta l'icona rispetto alla scheda e questo potrebbe cambiare con una nuova versione di Windows. E l'icona si trova a sinistra del titolo, ma non sembra troppo male.

Altri suggerimenti

Ho trovato questo codice e mi è stato molto utile:

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: come acquisire il mouse con il tasto destro del mouse Nella scheda

Ho fatto quanto segue: sullo stage create (aggiungi) TabPage , ho aggiunto un toolStrip

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

Quindi, crea il pulsante X e aggiungilo a toolstrip

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

crea un evento facendo clic sul pulsante X

ToolStripButton.Click += new EventHandler(ToolStripButton_Click);

aggiungi toolstrip alla tabpage

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

ora per ToolStripButton_Click è il seguente:

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

Forse non è come vuoi, ma funzionerà bene.

Ho creato un'installazione simile.

Ogni controllo che viene aggiunto alla pagina della scheda in fase di esecuzione deriva da uno speciale controllo di base che ho creato. Questo controllo di base ha un pulsante di chiusura (insieme ad alcune altre funzionalità come la chiusura sicura della bandiera).

Chiudi il codice della scheda che sto usando sul mio controllo di base:

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

tabControl.TabPages.Remove(parent);

So che si tratta di un vecchio thread ma ho trovato questo link che ti permetterà di " nascondere " schede in un array, quindi è possibile ricaricare le schede desiderate in fase di esecuzione. L'ho aggiunto di più per un posto che posso facilmente trovare di nuovo.

Questo codice potrebbe aiutare Throgh a chiudere i controlli delle schede con un clic centrale 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;
                    }
                }
            }

Funziona!

TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(tabpage);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top