【发布时间】:2010-12-27 10:57:48
【问题描述】:
【问题讨论】:
-
你是怎么得到背景白色的?这不是标准的。
【问题讨论】:
这是“系统”渲染器中的一个错误,详情见this bug report。
微软的回复给出了一个非常简单的解决方法:
1) 创建ToolStripSystemRenderer 的子类,覆盖OnRenderToolStripBorder 并使其成为空操作:
public class MySR : ToolStripSystemRenderer
{
public MySR() { }
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
//base.OnRenderToolStripBorder(e);
}
}
2) 将该渲染器用于您的工具条。必须在对工具条的 RenderMode 属性进行任何分配之后分配渲染器,否则它将被对 System.Windows.Forms 渲染器的引用覆盖。
toolStrip3.Renderer = new MySR();
【讨论】:
您可能需要添加类型检查以避免ToolStripDropDownMenu/etc 上缺少边框。 (由于继承自ToolStrip,它会自动启动相同的自定义渲染器使用):
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
if (e.ToolStrip.GetType() == typeof(ToolStrip))
{
// skip render border
}
else
{
// do render border
base.OnRenderToolStripBorder(e);
}
}
使用ToolStripSystemRenderer 时错过的ToolStripDropDownMenu 边框并不那么明显,但使用ToolStripProfessionalRenderer 时会变得非常碍眼。
此外,如果您希望应用程序范围内的所有ToolStrip 实例默认使用MySR,设置System.Windows.Forms.ToolStripManager.Renderer = new MySR(); 可能会很有用。
【讨论】:
这门课比其他的更全!
public class ToolStripRender : ToolStripProfessionalRenderer
{
public ToolStripRender() : base() { }
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
if (!(e.ToolStrip is ToolStrip))
base.OnRenderToolStripBorder(e);
}
}
【讨论】: