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();
我希望我的 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();