it-swarm.com.de

Anpassen eines TabControl für das Schließen einzelner Registerkarten

Mein Szenario ist folgendes:

Ich arbeite an einer Winforms-Anwendung in C #, die eine Schaltfläche auf der Hauptseite einer Registerkarte enthält, die bei jedem Klicken eine neue Registerkarte generiert. Jede neue Registerkarte enthält ein von einem Benutzersteuerelement definiertes Layout. 

Meine Fragen sind:

  1. Wie kann ich dem Benutzer gestatten, eine der Registerkarten zu schließen, die zur Laufzeit dynamisch erstellt wurden?

  2. Wie kann ich die Tabulatorsteuerung selbst so ändern, dass sie in jedem Tab ein kleines "X" enthält, auf den der Benutzer klicken kann, um diesen Tab zu schließen? (Wie Firefox hat)

  3. Wie kann ich die SelectedIndex-Eigenschaft des Registersteuerelements für das Benutzersteuerelement verfügbar machen, wenn ich stattdessen die Registerkarte mit einer Schaltfläche im Benutzersteuerelement schließen möchte?

18
THE DOCTOR

Ich habe vor etwa einem Jahr eine abgeleitete Registerkarte erstellt. Ich werde die Quelle hier nicht posten, da sie ungefähr 700 Zeilen lang ist und ziemlich chaotisch codiert ist. Vielleicht werde ich etwas Zeit finden, um den Code aufzuräumen und dann hier zu veröffentlichen. Im Moment werde ich kurz beschreiben, wie es gebaut wird.

Jede Registerkartenseite hat ein "X" -Symbol neben left des Titels, und die Registerkarten unterstützen das Umordnen durch Ziehen und Ablegen sowie das Verschieben zwischen Registerkarten mit mehreren Registerkarten.

Ich wähle den einfachen Weg, um das Symbol auf den Registerkarten zu erhalten. Das Registersteuerelement verfügt über die Eigenschaft TabControl.ImageList und eine Registerseite verfügt über die Eigenschaft TabPage.ImageIndex . Also habe ich nur drei Icons zu einer Bilderliste hinzugefügt - normal, schweben, gedrückt - und die Mausereignisse verarbeiten.

Mit TabControl.GetTabRect() können Sie testen, ob sich der Mauszeiger über bestimmten Registerkarten befindet, und mit etwas Mathe können Sie feststellen, ob er sich über dem Symbol befindet. Dann müssen Sie nur das Symbol in Abhängigkeit vom Zustand der Maustasten ändern und eventuell die Registerkarte unter der Maus entfernen, wenn die Taste gedrückt wurde.

Das Hauptproblem bei dieser Lösung besteht darin, dass beim Berechnen, ob sich der Mauszeiger über dem Symbol befindet, zu erkennen ist, wo das Symbol relativ zur Registerseite angezeigt wird. Dies kann sich bei einer neuen Windows-Version ändern. Das Symbol befindet sich links vom Titel, aber das sieht nicht schlecht aus.

9

Ich habe diesen Code gefunden und war mir sehr hilfreich:

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: Erfassen der Maus mit der rechten Maustaste auf die Registerkarte

14
Vallel

Ich habe folgendes gemacht: Auf der Stufe create (add) TabPage, ich habe eine toolStrip hinzugefügt

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

Erstellen Sie dann die Schaltfläche X und fügen Sie sie zu toolstrip hinzu.

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

erstellen Sie ein Ereignis, indem Sie auf die Schaltfläche X klicken 

ToolStripButton.Click += new EventHandler(ToolStripButton_Click);

toolstrip zur tabpage hinzufügen

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

jetzt für den ToolStripButton_Click lautet wie folgt:

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

Vielleicht ist es nicht so, wie Sie wollen, aber es wird gut funktionieren.

6
Muhammad Hamad

Ich habe ein ähnliches Setup erstellt.

Jedes Steuerelement, das der Registerkarte zur Laufzeit hinzugefügt wird, wird von einem speziellen von mir erstellten Basissteuerelement abgeleitet. Dieses Basissteuerelement verfügt über eine Schaltfläche zum Schließen (zusammen mit einigen anderen Funktionen, wie z. B. das Symbol zum sicheren Schließen).

Tabulatorcode schließen, den ich für meine Basissteuerung verwende:

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

tabControl.TabPages.Remove(parent);
2
Crispy

Ich weiß, dass dies ein alter Thread ist, aber ich habe dieses link gefunden, mit dem Sie Tabs in einem Array "ausblenden" können. Dann können Sie einfach die Tabs neu laden, die Sie zur Laufzeit benötigen. Ich habe dies für einen Ort hinzugefügt, den ich leicht wiederfinden kann.

1
Mark Kram

Dieser Code kann helfen, die Tab-Steuerelemente mit einem mittleren Mausklick zu schließen: 

            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;
                    }
                }
            }
0