ToolStrip 圆角化

11

我正在开发一个Windows表单应用程序 (C#,.NET 4.0,VS 2010),其中我有一个带有ToolStrip的标准MainForm (GripStyle: Hidden,Dock: Top,RenderMode: ManagerRenderMode)。ToolStrip包含一些基本项(ToolStripLabel、ToolStripSeparator、ToolStripSplitButton)。

渲染如下:

ToolStrip rendered by default ManagerRenderMode

起初,我只想在toolstrip下方添加一个“底部”边框,但我还注意到这个toolstrip被渲染为“圆角”(你可以在图像中看到右侧顶部和底部的圆角),并有一条垂直渐变线。

我该如何使这些角不是圆的?

我尝试过:

public class MainFormToolStripRenderer : ToolStripProfessionalRenderer
{
    protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
    {
        base.OnRenderToolStripBorder(e);

        var y = e.ToolStrip.Height-1;
        e.Graphics.DrawLine(new Pen(SystemColors.ControlDark, 1), new Point(0, y), new Point(e.ToolStrip.Width, y));
    }

在我的表单初始化中,通过this.toolStrip_Actions.Renderer=new MainFormToolStripRenderer();将其连接起来。

这给了我底部边框,但对于圆角没有任何效果。而且,随着底部边框的添加,圆角更加明显:

ToolStrip rendered by custom ToolStripProfessionalRenderer

接下来,我尝试在上述事件处理程序中绘制矩形,以尝试(至少)隐藏圆角和垂直渐变背后的实心矩形边框。由于可用的绘图区域(e.AffectedBounds)位于圆角边框内部,因此这并没有起作用。

我还尝试将ToolStrip的RenderMode设置为System(不使用我的渲染器)。在这种情况下,工具栏的角似乎很贴合(矩形),但是工具栏中的分割按钮似乎已经损坏了(单击向下箭头不会显示下拉列表),原因尚不清楚,整体外观感觉有点平淡(在工具栏中悬停在某些按钮上之前)。

我想最终我宁愿坚持ManageeRenderedMode或从Professional中继承的自定义渲染器,但我需要摆脱圆角。我还找到了这个SO Q,它似乎接近我正在寻找的内容,但没有为我的情况提供答案。

谢谢您提前。


1
Winforms对于渲染不同的东西而不创建自己的控件来说是一种痛苦。现在可能为时已晚,但你有没有尝试过WPF/XAML? - iMortalitySX
谢谢,但我们之前看过WPF,现在我们正在尝试坚持使用“基本”的winforms。如果需要覆盖某些细节,我不介意从标准工具栏继承,但是确实很好不必自己渲染整个工具栏(特别是我们需要的分割按钮等等)。 - FOR
3个回答

11

在您的渲染器类中尝试使用以下代码:

public class MainFormToolStripRenderer : ToolStripProfessionalRenderer {

  public MainFormToolStripRenderer() {
    this.RoundedEdges = false;
  }
}

太棒了!谢谢(我实际上在我的自定义渲染器中将.RoundedEdges属性设置为false,但那就是诀窍)!现在还有一点麻烦,因为现在角落不再是圆形的,分割按钮停止工作了...但是我会接受你的答案,因为它解决了主要问题并让我走上了正确的道路。 - FOR
3
实际上,在ToolStrip控件的属性中有一个RenderMode选项,它有三个选项:System、Professional和ManagerRenderMode。第一个选项允许操作系统渲染ToolStrip,但是不会圆角化,而最后两个选项则会进行圆角化处理。 - am05mhz

4

基于 LarsTech被采纳的答案,除非有强制性的原因需要这样做,否则您不需要实现新的 Renderer 类。

您可以使用以下一行代码来完成此操作:

toolStrip_Actions.Renderer = new ToolStripProfessionalRenderer() { RoundedEdges = false };

如果ToolStrip的RenderMode设置为ManagerRenderMode,则默认呈现器已经是ToolStripProfessionalRenderer,因此您可以将其强制转换为此类并直接访问RoundedEdges属性,如下所示:

((ToolStripProfessionalRenderer)toolStrip_Actions.Renderer).RoundedEdges = false;

3
正如am05mhz所提到的,只需选择渲染模式 > 系统,圆角就会消失:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接