【问题标题】:ToolStrip Rounded CornersToolStrip 圆角
【发布时间】:2012-11-05 07:18:05
【问题描述】:

我正在开发一个 Windows 窗体应用程序(C#、.NET 4.0、VS 2010),其中我有一个带有 ToolStrip 的非常标准的 MainForm(GripStyle:隐藏,Dock:顶部,RenderMode:ManagerRenderMode)。工具条包含一些基本项(ToolStripLabel、ToolStripSeparator、ToolStripSplitButton)。

呈现如下:

起初我只是想在工具条下方添加一个“底部”边框,但我也注意到这个工具条是用“圆角”渲染的(您可以在图像中看到右侧的顶部和底部) ) 和垂直渐变线。

如何使这些角不圆?

我试过了:

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(); 将其连接起来。

这给了我底部边框,但对圆角没有做任何事情。此外,通过添加底部边框,圆角更加明显:

接下来,我尝试在上面的同一事件处理程序中绘制一个矩形,以尝试(至少)将圆角和垂直渐变隐藏在实心矩形边框后面。这不起作用,因为可用的绘图区域 (e.AffectedBounds) 在圆形边框内。

我还尝试将 ToolStrip 的 RenderMode 设置为 System(而不是使用我的渲染器)。在这种情况下,工具条的角落似乎很贴合(矩形),但工具栏中的拆分按钮似乎已损坏(单击向下箭头不显示下拉菜单),原因尚不清楚,整体外观-n -feel 有点令人印象深刻(非常平淡,直到您将鼠标悬停在工具条中的某些按钮上)。

我想最后我宁愿坚持使用 ManageeRenderedMode,或者从 Professional 继承的自定义渲染器 - 但我需要摆脱圆角。 其中,我发现 this SO Q 似乎与我正在查看的内容很接近,但没有为我的案例提供答案。

提前致谢

【问题讨论】:

  • Winforms 在不完全创建自己的控件的情况下渲染不同的东西是一件痛苦的事情。现在可能为时已晚,但是您是否搞砸了 WPF/XAML?
  • 谢谢,但我们之前看过 WPF,现在我们正试图坚持使用“基本”winforms。如果我需要覆盖某些细节,我不介意从标准工具条继承,但是是的:不必自己渲染整个东西会很好(尤其是我们需要在其中的拆分按钮等) )

标签: c# winforms render toolstrip


【解决方案1】:

LarsTechaccepted answer 为基础,您不一定需要实现新的渲染器类,除非有令人信服的理由。

您可以按照以下方式将其作为一个单行来执行:

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

或者由于 RenderMode 设置为 ManagerRenderMode 的 ToolStrip 的默认渲染器已经是 ToolStripProfessionalRenderer,您可以将其转换为这样并直接访问 RoundedEdges 属性,如下所示:

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

【讨论】:

    【解决方案2】:

    正如 am05mhz 提到的,只需选择 RenderMode > System 圆角就会消失:

    【讨论】:

      【解决方案3】:

      在你的渲染器类中试试这个:

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

      【讨论】:

      • 太棒了!谢谢(我实际上在自定义渲染器中将 .RoundedEdges 属性设置为 false,但这就是诀窍)!仍然有点麻烦,因为现在角落没有变圆,拆分按钮停止工作......但我会接受你的回答,因为它解决了主要问题并使我走上了正确的道路。
      • 实际上,ToolStrip 属性中有一个 RenderMode 选项,它有 3 个选项:System、Professional 和 ManagerRenderMode。第一个选项让操作系统渲染未四舍五入的 ToolStrip,最后两个是四舍五入
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 2013-05-15
      • 1970-01-01
      • 2013-01-08
      相关资源
      最近更新 更多