设置TabPage标题颜色

时间:2011-03-17 11:49:00

标签: c# winforms colors header tabcontrol

问候,

我有一个标签控件,我希望其中一个标签在事件中更改了文本颜色。 我找到了像C# - TabPage Color event这样的答案 和C# Winform: How to set the Base Color of a TabControl (not the tabpage) 但使用这些设置所有颜色而不是一个。

所以我希望有一种方法可以使用我希望更改为方法而不是事件的选项卡来实现此功能吗?

类似的东西:

public void SetTabPageHeaderColor(TabPage page, Color color) 
{
    //Text Here
}

4 个答案:

答案 0 :(得分:26)

如果要为标签着色,请尝试以下代码:

this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tabControl1_DrawItem);

private Dictionary<TabPage, Color> TabColors = new Dictionary<TabPage, Color>();
private void SetTabHeader(TabPage page, Color color)
{
    TabColors[page] = color;
    tabControl1.Invalidate();
}
private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
    //e.DrawBackground();
    using (Brush br = new SolidBrush (TabColors[tabControl1.TabPages[e.Index]]))
    {
        e.Graphics.FillRectangle(br, e.Bounds);
        SizeF sz = e.Graphics.MeasureString(tabControl1.TabPages[e.Index].Text, e.Font);
        e.Graphics.DrawString(tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + (e.Bounds.Width - sz.Width) / 2, e.Bounds.Top + (e.Bounds.Height - sz.Height) / 2 + 1);

        Rectangle rect = e.Bounds;
        rect.Offset(0, 1);
        rect.Inflate(0, -1);
        e.Graphics.DrawRectangle(Pens.DarkGray, rect);
        e.DrawFocusRectangle();
    }
}

答案 1 :(得分:17)

对于阅读此内容的WinForms用户 - 仅当您将标签控件的DrawMode设置为OwnerDrawFixed时,此方法才有效 - 如果将DrawItem事件设置为“正常”,则它永远不会触发。

答案 2 :(得分:6)

如果要使用垂直标签(如我然后你会需要这样的东西:

    private void tabControl2_DrawItem(object sender, DrawItemEventArgs e)
    {
        using (Brush br = new SolidBrush(tabColorDictionary[tabControl2.TabPages[e.Index]]))
        {
            // Color the Tab Header
            e.Graphics.FillRectangle(br, e.Bounds);
            // swap our height and width dimensions
            var rotatedRectangle = new Rectangle(0, 0, e.Bounds.Height, e.Bounds.Width);

            // Rotate
            e.Graphics.ResetTransform();
            e.Graphics.RotateTransform(-90);

            // Translate to move the rectangle to the correct position.
            e.Graphics.TranslateTransform(e.Bounds.Left, e.Bounds.Bottom, System.Drawing.Drawing2D.MatrixOrder.Append);

            // Format String
            var drawFormat = new System.Drawing.StringFormat();
            drawFormat.Alignment = StringAlignment.Center;
            drawFormat.LineAlignment = StringAlignment.Center;

            // Draw Header Text
            e.Graphics.DrawString(tabControl2.TabPages[e.Index].Text, e.Font, Brushes.Black, rotatedRectangle, drawFormat);
        }
    }

我将回应 ROJO1969 的观点,如果这是在WinForms中 - 那么你必须将DrawMode设置为 OwnerDrawFixed

特别感谢这个精彩的blog entry,它描述了如何在表单上轮换文本。

答案 3 :(得分:1)

var assets = [{
  "name": "\/asset\/image\/map\/map-grass.svg",
  "url": "\/asset\/image\/map\/map-grass.svg"
}, {
  "name": "\/asset\/image\/map\/map-stone.svg",
  "url": "\/asset\/image\/map\/map-stone.svg"
}]

Object.keys(assets).forEach(key => {
  const val = assets[key];
  console.log(val)
});