Я хочу потянуть пользовательское TabControl
с пользовательской функциональностью.
Чтобы сделать это, я наследовал класс Панели и метод overrided OnPaint для рисования с TabRenderer
класс.
Проблема - это TabRenderer
работа только, когда визуальные стили включили (может быть сверен TabRenderer.IsSupported
), но что я должен сделать, если бы визуальные стили отключили?
В этом случае я думал с помощью ControlPaint
класс для рисования вкладок без визуальных стилей но это не имеет никаких, рисуют методы, связанные с Вкладками. Я хочу, чтобы это в основном вело себя визуально как постоянный клиент TabControl
.
Вы должны нарисовать его самостоятельно, потому что для этого не существует опубликованного API. Надеюсь, это относительно легко сделать без визуальных стилей.
Вы можете нарисовать границу панели с помощью ControlPaint.DrawBorder3D и использовать что-то вроде следующего кода для кнопок:
int Top = bounds.Top;
int Bottom = bounds.Bottom - 1;
int Sign = 1;
if (tabStrip.EffectiveOrientation == TabOrientation.Bottom)
{
Top = bounds.Bottom - 1;
Bottom = bounds.Top;
Sign = -1;
}
using (Pen OuterLightBorderPen = new Pen(SystemColors.ControlLightLight))
{
e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Bottom, bounds.Left, Top + 2 * Sign);
e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Top + 2 * Sign, bounds.Left + 2, Top);
e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left + 2, Top, bounds.Right - 3, Top);
}
using (Pen InnerLightBorderPen = new Pen(SystemColors.ControlLight))
{
e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 1, Bottom, bounds.Left + 1, Top + 2 * Sign);
e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 2, Top + 1 * Sign, bounds.Right - 3, Top + 1 * Sign);
}
using (Pen OuterDarkBorderPen = new Pen(SystemColors.ControlDarkDark))
{
e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 2, Top + 1 * Sign, bounds.Right - 1, Top + 2 * Sign);
e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 1, Top + 2 * Sign, bounds.Right - 1, Bottom);
}
using (Pen InnerDarkBorderPen = new Pen(SystemColors.ControlDark))
e.Graphics.DrawLine(InnerDarkBorderPen, bounds.Right - 2, Top + 2 * Sign, bounds.Right - 2, Bottom);
Это ответ "оттуда", но возможно ли, что вы могли бы использовать wpf? Как видно из ответа выше, настраивать элементы управления в winforms, где, как и в WPF, каждый элемент управления - это боль в ухе. Это означает, что вы полностью контролируете, что визуализируется и как это выглядит.