Skip to main content

TabControl

Ein TabControl ist ein Container, der mehrere TabPageTabPage-Instanzen verwaltet und zwischen ihnen umschaltet.

Es stellt die Tabs (Reiter) dar und bestimmt, welche TabPage aktuell sichtbar ist.


Grundidee

Das TabControl ist die Steuerung, nicht der Inhalt.

    TabControl → verwaltet Tabs

    TabPage → enthält den eigentlichen Inhalt

    Ohne TabPage ist das TabControl nur leere UI-Deko.


    Wichtige Eigenschaften

      TabPages – (leer)
      Sammlung aller enthaltenen TabPage-Instanzen

      SelectedIndex – -1 → 0 (mit erstem TabPage)
      Index des aktuell aktiven Tabs (0-basiert)

      SelectedTab – $null
      Referenz auf die aktuell aktive TabPage

      Alignment – "Top"
      Position der Tabs (Top, Bottom, Left, Right)

      Appearance – "Normal"
      Darstellung der Tabs (Normal, Buttons, FlatButtons)

      SizeMode – "Normal"
      Größe der Tabs (Normal, Fixed)

      ItemSize – {Width=0, Height=0}
      Größe einzelner Tabs (nur relevant bei Fixed)

      Multiline – $false
      Mehrere Reihen von Tabs erlauben

      HotTrack – $false
      Hover-Effekt über Tabs

      Dock – None
      Layout innerhalb des Parent-Containers (meist Fill)


      TabControl erstellen

      # TabControl Erstellen
      $tabControl = New-Object System.Windows.Forms.TabControl
      $tabControl = [System.Windows.Forms.TabControl]::New()

      Tab hinzufügen / entfernen

      # Hinzufügen
      $tabControl.TabPages.Add($tabPage1)
      $tabControl.TabPages.Add("Mein Tab") # erstellt TabPage (nur Text gesetzt)
      $tabControl.TabPages.Add("Name", "Text") # Name + Text
      $tabControl.TabPages.AddRange(@($tabPage2, $tabPage3)) # mehrere TabPages
      $tabControl.TabPages.Insert(0, $tabPage4) # Index, TabPage
      
      # Entfernen
      $tabControl.TabPages.Remove($tabPage1)
      $tabControl.TabPages.RemoveAt(0) # per Index
      $tabControl.TabPages.Clear() # alle entfernen
      
      
      # technisch möglich, aber nicht empfohlen
      $tabControl.Controls.Add($tabPage4) 
      $tabControl.Controls.AddRange(@($tabPage5, $tabPage6))
      $tabControl.Controls.Remove($tabPage2)
      $tabControl.Controls.RemoveRange(@($tabPage3, $tabPage4))

      Tab-Auswahl

      # Zugriff auf einzelnes TabPage
      $tabControl.TabPages[0] 
      
      # Zugriff auf aktuelles TabPage
      $tabControl.SelectedIndex = 0 # nur Index
      $tabControl.SelectedTab = $tabPage1
      

      Events

      Hier passiert der eigentliche Spaß.

        SelectedIndexChanged
        Wird ausgelöst, nachdem der Tab gewechselt wurde

        Selecting
        Wird ausgelöst, bevor ein Tab gewechselt wird
        → kann abgebrochen werden ($_.Cancel = $true)

        Selected
        Wird ausgelöst, nachdem ein Tab ausgewählt wurde (ähnlich wie SelectedIndexChanged, aber mit EventArgs)

        Deselecting / Deselected
        Beim Verlassen eines Tabs


        Beispiel: Tab-Wechsel verhindern

        $tabControl.add_Selecting({
            if ($tabControl.SelectedIndex -eq 0) {
                $_.Cancel = $true
            }
        })
        

        Typische Stolperfallen

          Events greifen nicht richtig
          → falsches Event gewählt (SelectedIndexChanged vs. Selecting)

          Tabs sehen komisch aus
          → Kombination aus Appearance, SizeMode und ItemSize

          Layout bricht
          Dock oder Anchor nicht sauber gesetzt

          Falscher Zugriff auf Inhalte
          → Inhalt liegt in TabPage.Controls, nicht direkt im TabControl


          Mentales Modell

          Das TabControl ist ein Umschalter für Container.

          Es zeigt immer genau eine TabPage gleichzeitig an
          und blendet die anderen intern einfach aus.


          Wann sinnvoll?

            Mehrere logisch getrennte Bereiche

            Einstellungen / Konfigurationen

            Platz sparen ohne mehrere Fenster


            Wann vermeiden?

              Wenn Nutzer ständig zwischen Tabs springen müssen

              Wenn Inhalte stark voneinander abhängen

              Wenn der Workflow linear ist (→ lieber Schritt für Schritt UI)