设计时带有水平文本的垂直选项卡控件

4
3个回答

5

创建自己的控件,以便自定义绘制也可以在设计时工作。向项目中添加一个新类,并粘贴下面显示的代码。编译。从工具箱的顶部拖放新控件到您的表单上。我稍微调整了一下,使它不是那么刺眼。

using System;
using System.Drawing;
using System.Windows.Forms;

class VerticalTabControl : TabControl {
    public VerticalTabControl() {
        this.Alignment = TabAlignment.Right;
        this.DrawMode = TabDrawMode.OwnerDrawFixed;
        this.SizeMode = TabSizeMode.Fixed;
        this.ItemSize = new Size(this.Font.Height * 3 / 2, 75);
    }
    public override Font Font {
        get { return base.Font;  }
        set {
            base.Font = value;
            this.ItemSize = new Size(value.Height * 3 / 2, base.ItemSize.Height);
        }
    }
    protected override void OnDrawItem(DrawItemEventArgs e) {
        using (var _textBrush = new SolidBrush(this.ForeColor)) {
            TabPage _tabPage = this.TabPages[e.Index];
            Rectangle _tabBounds = this.GetTabRect(e.Index);

            if (e.State != DrawItemState.Selected) e.DrawBackground();
            else {
                using (var brush = new System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, Color.White, Color.LightGray, 90f)) {
                    e.Graphics.FillRectangle(brush, e.Bounds);
                }
            }

            StringFormat _stringFlags = new StringFormat();
            _stringFlags.Alignment = StringAlignment.Center;
            _stringFlags.LineAlignment = StringAlignment.Center;
            e.Graphics.DrawString(_tabPage.Text, this.Font, _textBrush, _tabBounds, new StringFormat(_stringFlags));
        }
    }
}

你为什么使用 Font.Height * 3 / 2 来调整 ItemSize 属性的高度?我认为使用 TextRenderer.MeasureText 会是一个更好的方法,这样做有什么原因吗? - Alex Essilfie
不是特别的,只是为了在选项卡中留出足够的余量。选择任何你想要的东西。 - Hans Passant
好的。我的好奇心现在得到了满足。在我的实现这里中,我使用了TextRenderer.MeasureText返回的高度,然后加上了Padding.Y值。我这样做是因为它使我的自定义控件与标准的TabControl保持一致。 - Alex Essilfie

3
你需要创建 TabControl 的子类并重写 OnDrawItem 方法。这里是一个例子:
Public Class UITabControl
    Inherits TabControl

    Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs)
        Using brush As New SolidBrush(Me.ForeColor)
            Using format As New StringFormat() With {.LineAlignment = StringAlignment.Center}
                Select Case Me.Alignment
                    Case TabAlignment.Left
                        format.Alignment = StringAlignment.Near
                    Case TabAlignment.Top
                        format.Alignment = StringAlignment.Far
                End Select
                format.FormatFlags = (format.FormatFlags Or StringFormatFlags.NoWrap)
                Dim rect As Rectangle = e.Bounds
                rect.X += 3
                rect.Width -= 6
                e.Graphics.DrawString(Me.TabPages(e.Index).Text, Me.Font, brush, rect, format)
            End Using
        End Using
        MyBase.OnDrawItem(e)
    End Sub

End Class

+1。虽然我更喜欢@HansPassant的解决方案,但这个渐变很棒。 - Victor Zakharov

0

既然您链接到了我的问题,我认为通知您有关我的问题线程的更新是必要的。

回答我的问题中,我上传了控件代码,以便于编程社区的利益。

这是运行时控件的屏幕截图。
Vertical Tabs Control screenshot

它具有完整的设计时支持,自动调整选项卡大小(最大可达128像素宽)和选项卡图标等功能。

代码可以从此处下载。


谢谢。如果您概述了自定义控件的基本属性,以及为什么应该使用它,甚至在您的答案中添加一些代码,这可能对其他开发人员有所帮助。否则看起来像广告(即使产品是免费的)。请注意,在文件共享上发布代码并不可靠。最好创建一个开源项目(例如GitHub),这样人们可以扩展您的创建,并且它不会在2年后丢失。 - Victor Zakharov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接