ToolStrip.Background 仅更改按钮的背景 (C#/.NET/WinForms)

ToolStrip.Background only changes button's background (C#/.NET/WinForms)

我希望我的 ToolStrip 背景在项目未保存时发生变化。

为了渲染工具条的背景,我使用了自己的渲染器:

    class ToolStripRenderer : ToolStripProfessionalRenderer
    {
        private MenuBarForm parent;

        public ToolStripRenderer(MenuBarForm Parent)
        {
            parent = Parent;
        }

        protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e)
        {
            if (parent.controlItems.Last().Unsaved)
                e.Graphics.FillRectangle(new System.Drawing.Drawing2D.LinearGradientBrush(e.ToolStrip.ClientRectangle, SystemColors.ControlLightLight, Color.Red, 90, true), e.AffectedBounds);
            else
                e.Graphics.FillRectangle(new System.Drawing.Drawing2D.LinearGradientBrush(e.ToolStrip.ClientRectangle, SystemColors.ControlLightLight, SystemColors.ControlDark, 90, true), e.AffectedBounds);
        }
    }

第一次呈现工具条时,它使用灰色到深灰色设计正确呈现:

但是当栏应该变成红色时,只有鼠标悬停在上面的按钮变成红色:

我希望整个工具条立即变成红色。

我已经尝试将 e.AffectedBounds 更改为 e.ToolStrip.Bounds,但无济于事。

我找到了这个解决方案感谢 FSDaniel 评论:

通过将 Invalidate() 添加到 OnRenderToolStripBackground 的末尾,工具条确实变成了全红色,但也导致应用程序进入无限循环。我通过创建一个通过更改 UnSaved 属性 触发的事件解决了这个问题。然后,具有工具条的表单订阅了一个调用 toolstrip.Invalidate() 的事件的方法。这样Invalidate()只在需要的时候才用

您可以创建自定义颜色 table 继承 ProfessionalColorTable 并覆盖相关属性以更改背景颜色:

public class CustomColorTable : ProfessionalColorTable
{
    public override Color ToolStripGradientBegin
    {
        get { return Color.Red; }
    }
    public override Color ToolStripGradientMiddle
    {
        get { return Color.Red; }
    }
    public override Color ToolStripGradientEnd
    {
        get { return SystemColors.ControlLightLight; }
    }
}

要更改您的 ToolStrip 背景,请指定新的 ToolStripProfessionalRenderer which uses your custom color table to ToolStripManager.Renderer:

ToolStripManager.Renderer = new ToolStripProfessionalRenderer(new CustomColorTable());

设置原创专业渲染器:

ToolStripManager.Renderer = new ToolStripProfessionalRenderer();