Практическое руководство. Отображение вкладок Side-Aligned с помощью TabControl
Свойство AlignmentTabControl поддерживает вертикальное отображение вкладок (вдоль левого или правого края элемента управления), а не горизонтально (в верхней или нижней части элемента управления). По умолчанию это вертикальное отображение приводит к плохому интерфейсу пользователя, так как свойство Text объекта TabPage не отображается на вкладке при включении визуальных стилей. В табуляции также нет прямого способа управления направлением текста. Вы можете использовать собственную отрисовку на TabControl для улучшения этого восприятия.
В следующей процедуре показано, как с помощью функции "собственная прорисовка" отображаются табуляции, выровненные по правому краю, с текстом, располагающимся слева направо.
Отображение выровненных по правому краю вкладок
Добавьте TabControl в форму.
Установите для свойства SizeMode значение Fixed, чтобы все вкладки были одной ширины.
Задайте для свойства ItemSize предпочитаемый фиксированный размер для вкладок. Помните, что свойство ItemSize ведет себя так, как будто вкладки находятся наверху, хотя они выровнены справа. В результате, чтобы сделать вкладки более широкими, необходимо изменить свойство Height, а чтобы сделать их более высокими, необходимо изменить свойство Width.
Для оптимального результата в приведенном ниже примере кода задайте для Width вкладок значение 25, а Height — 100.
Задайте для свойства DrawMode значение OwnerDrawFixed.
Определите обработчик события DrawItem для TabControl, который рендерит текст слева направо.
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
См. также
- элемент управления TabControl
.NET Desktop feedback