如何:使用 TabControl 显示边对齐的选项卡

TabControlAlignment 属性支持垂直显示选项卡(沿控件的左边缘或右边缘),而不是水平显示(沿控件的顶部或底部)。 默认情况下,此垂直显示会造成不良的用户体验,因为当视觉样式启用时,TabPage 对象的 Text 属性不显示在选项卡中。 此外,也没有直接的方法来控制选项卡内文本的方向。可以使用 TabControl 的所有者描述来改善此体验。

下面的过程演示如何使用“所有者描述”功能呈现右对齐的选项卡(选项卡文本的运行方向从左到右)。

显示右对齐的选项卡

  1. 在窗体中添加 TabControl

  2. Alignment 属性设置为 Right

  3. SizeMode 属性设置为 Fixed,以以使所有选项卡具有相同的宽度。

  4. ItemSize 属性设置为选项卡的首选固定大小。 请记住,ItemSize 属性的行为如同选项卡位于顶部时的行为一样,尽管它们是右对齐的。 因此,为了增加选项卡宽度,必须更改 Height 属性;为了增加选项卡高度,必须更改 Width 属性。

    在下面的代码示例中,将选项卡的 Width 设置为 25,Height 设置为 100 可得到最佳结果。

  5. DrawMode 属性设置为 OwnerDrawFixed

  6. 为从左到右呈现文本的 TabControlDrawItem 事件定义一个处理程序。

    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
    

另请参阅