【问题标题】:How to avoid 3 pixel gap on left of ToolStrip in Winforms?如何避免 Winforms ToolStrip 左侧的 3 个像素间隙?
【发布时间】:2013-02-17 19:11:29
【问题描述】:

我使用的是 Windows 7 和 Winforms/C#。

当我将工具条添加到工具条容器时,工具条左侧有 3 个像素的空间。即使我将位置设置为 0,0,它也会将其重置为 3,0。这是一张图片来证明这一点:

我怎样才能避免这种情况?我已将 ToolStripContainer 的填充和边距设置为 0,并尝试了不同的 RenderMode,但似乎没有任何帮助。有什么想法吗?

【问题讨论】:

  • 您是否尝试更改工具条项目(例如,那里似乎有一个间隔),看看是否将填充/边距更改为 0 以实现该效果...
  • 没有间隔项(或任何其他项),我只是将 GripMargin 设置为 10、2、2、2,这样更容易拖动。

标签: c# winforms margin padding toolstrip


【解决方案1】:
public Form1()
{
    InitializeComponent();
    this.toolStripContainer1.TopToolStripPanel.RowMargin = new Padding(0);
}

只需在ToolStripContainer 中设置 ToolStripPanels 的RowMargin 属性。它在设计器中不可用,因此需要在代码中设置,如上所示。显然,默认情况下,RowMarginLeft 属性设置为 3。这就是为什么当您将其设置为 0 时位置没有改变的原因。

结果:

编辑:似乎我激发了自己的好奇心。现在我想看看我是否可以摆脱底部的 2 像素间隙。到目前为止,这似乎更难追踪。

编辑 2:好的,我想通了。这是由ToolStrip 的渲染器完成的。在这个例子中,我使用System作为RenderMode,所以我在项目中添加了一个继承ToolStripSystemRenderer的新类,并覆盖了OnRenderToolStripBorder方法并注释掉了对基方法的调用。

using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class MyToolStripSystemRenderer : ToolStripSystemRenderer
    {
        protected override void  OnRenderToolStripBorder(ToolStripRenderEventArgs e)
        {
            //base.OnRenderToolStripBorder(e);
        }
    }
}


然后我在表单的构造函数中添加了另一行来分配自定义渲染器。

public Form1()
{
    InitializeComponent();
    this.toolStrip1.Renderer = new MyToolStripSystemRenderer();
    this.toolStripContainer1.TopToolStripPanel.RowMargin = new Padding(0);
}


结果:

编辑 3:所以我今天发现这是 ToolStripSystemRenderer 的一个已知错误。我想我没有找到它,因为我最初认为它与ToolStripContainer 有关。无论如何,对于那些有帮助的人,这里有一个关于工具条“边界”的问题。 https://stackoverflow.com/a/2060360/2056131

【讨论】:

  • 感谢您的解决方案!我刚刚为此开放了 50 点赏金,您可能对此感兴趣:stackoverflow.com/questions/15120432/…
  • @DanW 是的,我已经看到了这个问题,并且在我有时间的时候已经玩了几天。这不是一个可以干净利落地解决的问题。我已经发布了一个解决方案(令人惊讶的是,它是我尝试过的最短的方法,也可能是错误最少的方法),我希望它对你有用。