Condividi tramite


Procedura: Visualizzare le schede Side-Aligned con TabControl

La proprietà Alignment di TabControl supporta la visualizzazione delle schede in modalità verticale (lungo il bordo sinistro o destro del controllo), piuttosto che in modalità orizzontale (nella parte superiore o inferiore del controllo). Per impostazione predefinita, questa visualizzazione verticale genera un'esperienza utente scarsa, perché la proprietà Text dell'oggetto TabPage non viene visualizzata nella scheda quando gli stili di visualizzazione sono abilitati. Non esiste un modo diretto neanche per controllare la direzione del testo all'interno della scheda. Per migliorare questa esperienza, puoi usare il disegno personalizzato con TabControl.

La procedura seguente illustra come visualizzare le schede allineate a destra, con il testo della scheda che scorre da sinistra a destra, usando la funzionalità "disegno proprietario".

Per visualizzare le schede allineate a destra

  1. Aggiungere un TabControl al modulo.

  2. Impostare la proprietà Alignment su Right.

  3. Impostare la proprietà SizeMode su Fixed, in modo che tutte le schede siano della stessa larghezza.

  4. Impostare la proprietà ItemSize sulla dimensione fissa preferita per le schede. Tenete presente che la proprietà ItemSize si comporta come se le schede si trovassero in cima, anche se sono allineate a destra. Di conseguenza, per rendere le schede più ampie, è necessario modificare la proprietà Height e per renderle più alte, è necessario modificare la proprietà Width.

    Per ottenere risultati ottimali con l'esempio di codice riportato di seguito, impostare il Width delle schede su 25 e il Height su 100.

  5. Impostare la proprietà DrawMode su OwnerDrawFixed.

  6. Definire un gestore per l'evento DrawItem di TabControl che esegue il rendering del testo da sinistra a destra.

    public Form1()
    {
        // Remove this call if you do not program using Visual Studio.
        InitializeComponent();
    
        tabControl1.DrawItem += new DrawItemEventHandler(tabControl1_DrawItem);
    }
    
    private void tabControl1_DrawItem(Object sender, System.Windows.Forms.DrawItemEventArgs e)
    {
        Graphics g = e.Graphics;
        Brush _textBrush;
    
        // Get the item from the collection.
        TabPage _tabPage = tabControl1.TabPages[e.Index];
    
        // Get the real bounds for the tab rectangle.
        Rectangle _tabBounds = tabControl1.GetTabRect(e.Index);
    
        if (e.State == DrawItemState.Selected)
        {
    
            // Draw a different background color, and don't paint a focus rectangle.
            _textBrush = new SolidBrush(Color.Red);
            g.FillRectangle(Brushes.Gray, e.Bounds);
        }
        else
        {
            _textBrush = new System.Drawing.SolidBrush(e.ForeColor);
            e.DrawBackground();
        }
    
        // Use our own font.
        Font _tabFont = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Pixel);
    
        // Draw string. Center the text.
        StringFormat _stringFlags = new StringFormat();
        _stringFlags.Alignment = StringAlignment.Center;
        _stringFlags.LineAlignment = StringAlignment.Center;
        g.DrawString(_tabPage.Text, _tabFont, _textBrush, _tabBounds, new StringFormat(_stringFlags));
    }
    
    Private Sub TabControl1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles TabControl1.DrawItem
        Dim g As Graphics = e.Graphics
        Dim _TextBrush As Brush
    
        ' Get the item from the collection.
        Dim _TabPage As TabPage = TabControl1.TabPages(e.Index)
    
        ' Get the real bounds for the tab rectangle.
        Dim _TabBounds As Rectangle = TabControl1.GetTabRect(e.Index)
    
        If (e.State = DrawItemState.Selected) Then
            ' Draw a different background color, and don't paint a focus rectangle.
            _TextBrush = New SolidBrush(Color.Red)
            g.FillRectangle(Brushes.Gray, e.Bounds)
        Else
            _TextBrush = New System.Drawing.SolidBrush(e.ForeColor)
            e.DrawBackground()
        End If
    
        ' Use our own font.
        Dim _TabFont As New Font("Arial", 10.0, FontStyle.Bold, GraphicsUnit.Pixel)
    
        ' Draw string. Center the text.
        Dim _StringFlags As New StringFormat()
        _StringFlags.Alignment = StringAlignment.Center
        _StringFlags.LineAlignment = StringAlignment.Center
        g.DrawString(_TabPage.Text, _TabFont, _TextBrush, _TabBounds, New StringFormat(_StringFlags))
    End Sub
    

Vedere anche