【问题标题】:ToolStrip.Background only changes button's background (C#/.NET/WinForms)ToolStrip.Background 仅更改按钮的背景 (C#/.NET/WinForms)
【发布时间】:2016-06-02 08:29:04
【问题描述】:

我希望在未保存项目时更改 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,但无济于事。

【问题讨论】:

  • 听起来好像不需要更新控件。您是否尝试过在工具条上调用 Invalidate() ?强制更新?
  • 感谢您的回答。我已将其添加到问题中。
  • 请不要将答案作为问题的一部分发布。这让未来的读者感到困惑。将其发布为答案。
  • 不通过绘制来改变背景颜色,你可以创建一个新的颜色表并覆盖相关属性来改变背景颜色,然后在UnSaved改变时使用它。
  • 听起来很有趣。我不熟悉颜色表。您能否使用颜色表根据属性更改工具条背景颜色的示例代码。

标签: c# winforms toolstrip


【解决方案1】:

您可以创建一个继承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 分配给ToolStripManager.Renderer

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

设置原始专业渲染器:

ToolStripManager.Renderer = new ToolStripProfessionalRenderer();

【讨论】:

  • 感谢您的快速回答。不幸的是,这个解决方案对我不起作用。我尝试使用此代码添加您的 CustomColorTable 以更改渲染器` if (controlItems.Last().Unsaved) ToolStripManager.Renderer = new ToolStripProfessionalRenderer();否则 ToolStripManager.Renderer = new ToolStripProfessionalRenderer(new CustomColorTable());`
  • 要测试解决方案,只需将ToolStripRenderMode 属性设置为ManagerRenderMode,然后在需要时更改ToolStripManager.Renderer。要从您的 UnSaved 属性安排独立测试,您可以通过单击按钮调用 ToolStripManager.Renderer = new ToolStripProfessionalRenderer(new CustomColorTable()); 以确保它有效。
  • 如果您在应用答案时遇到任何问题,请告诉我。它已经过测试并且可以正常工作。
  • 在我之前的解决方案中,我没有使用ToolStripManagerToolStripManager 是否需要连接到 ToolStrip 才能工作?我的ToolStrip 也在ToolStripContainer 内,也许这会干扰ToolStripManager
  • 如果您将ToolStripRenderMode 属性设置为ManagerRenderMode,您的ToolStrip 将使用管理器。这是剥皮的主要机制ToolStrip
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多