"system" 渲染器中存在一个bug,详情请参见此错误报告。
微软的回复提供了一种非常简单的解决方法:
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
/等控件上丢失边框。(由于继承自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);
}
}
针对仅隐藏工具栏边框而不是下拉菜单边框的建议解决方案无效。
以下是解决方法:
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
//if (!(e.ToolStrip is ToolStrip)) base.OnRenderToolStripBorder(e); - does not work!
if (e.ConnectedArea.Width != 0) base.OnRenderToolStripBorder(e);
}