为什么 toolstriplabel 的背景色属性在设计时或运行时没有更改?



我需要有一个工具条标签和它的背景颜色在运行时改变,但无论我做什么。它只是不会改变它的背景色,即使他们提供了改变背景色的选项。为什么会这样?如何让它的backcolor属性在运行时或设计时改变?

提前致谢

这受到ToolStrip的RenderMode设置的影响。只有当你将其更改为System时,BackColor属性才会生效。其他渲染器使用主题颜色。你可能不太喜欢System,但是你可以通过实现自己的渲染器来鱼与熊掌兼得。让它看起来像这样:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.toolStrip1.Renderer = new MyRenderer();
    }
    private class MyRenderer : ToolStripProfessionalRenderer {
        protected override void OnRenderLabelBackground(ToolStripItemRenderEventArgs e) {
            using (var brush = new SolidBrush(e.Item.BackColor)) {
                e.Graphics.FillRectangle(brush, new Rectangle(Point.Empty, e.Item.Size));
            }
        }
    }
}

我不喜欢改变RenderMode,所以我这样做:

private static void SetBackgroundColor(ToolStripLabel tsl, Color c)
    {
        if (tsl != null)
        {
            Bitmap bm = new Bitmap(1, 1);
            using (Graphics g = Graphics.FromImage(bm)) { g.FillRectangle(new SolidBrush(c), 0, 0, 1, 1); }
            tsl.BackgroundImageLayout = ImageLayout.Stretch;
            Image oldImage = tsl.BackgroundImage;
            tsl.BackgroundImage = (Image)bm.Clone();
            if (oldImage != null) { oldImage.Dispose(); }
            bm.Dispose();
        }
    }

使用backgrounimage填充纯色位图。

你可以附加到BackColorChanged事件并调用这个函数

好主意,@ platter。谢谢。我试着让你的代码更简单,它为我工作:-)

ToolStripLabel.BackgroundImageLayout = ImageLayout.Stretch
ToolStripLabel.BackgroundImage = New Bitmap(1, 1)
Dim g As Graphics = Graphics.FromImage(ToolStripLabel.BackgroundImage)
g.Clear(Color.PaleGreen)

最新更新