【问题标题】:Label without Padding and Margin没有填充和边距的标签
【发布时间】:2014-03-05 03:41:22
【问题描述】:

我在 C# (.NET Framework 3.5) 中有以下代码

public partial class MainForm : Form
{
    public MainForm()
    {
        //
        // The InitializeComponent() call is required for Windows Forms designer support.
        //
        Label myControl = new Label();
        myControl.Text = "TEXT";
        myControl.FlatStyle = FlatStyle.System;
        myControl.AutoSize = true;
        myControl.BorderStyle = BorderStyle.FixedSingle;
        myControl.Padding = new Padding(0);
        myControl.Margin = new Padding(0);
        this.Controls.Add(myControl);
        InitializeComponent();


    }
}

应该显示一个带有边框的文本标签,如下所示:

------
|TEXT|
------

相反,我得到了这个:

--------
|TEXT  |
--------

我不知道为什么...我的目标是能够有多个标签之间没有空格,就像这样:

-----------
|TEXT|TEXT|
-----------

我错过了什么吗?提前致谢!

为了澄清,我需要在文本和边框之间没有空格。

【问题讨论】:

  • 可能是this answer 可以提供一些帮助
  • 看看FlowLayoutPanel这里msdn.microsoft.com/en-us/library/…,好像有你要找的东西
  • @Habib 不喜欢我的回答,所以我删除了它。 OP:尝试更改您的myControl.FlatStyle = FlatStyle.Standard; 不需要填充或边距,这是与其他控件的关系。
  • @Habib 不幸的是,这会修剪文本上的最后一个字符:(
  • 如果你需要这么紧,我会考虑不使用标签,而只是在容器的绘制事件中绘制边框和文本。

标签: c# winforms .net-3.5 labels


【解决方案1】:

我不知道FlatStyle 属性发生了什么,只是说FlatStyle.System 对我的系统有类似的影响。其他 FlatStyle 值清楚地表明了对控件的影响,但 FlatStyle.System 非常模糊。

控件的外观由用户的操作系统决定。

我不确定操作系统中的什么在他控制的布局中起作用。 LarsTech 关于将其更改为FlatStyle.Standard(或任何其他值)的评论为我解决了这个问题(并且不会删除任何文本,因为您的评论表明正在发生在您身上)

您可以通过将其显式设置为中心来覆盖对齐行为:

myControl.TextAlign = ContentAlignment.MiddleCenter;

我不确定你到底想要达到什么目的(因为你似乎可以在一个单独的文本中输入所有文本Label每个文本旁边不能有多个其他),但您可能还想删除边框样式:

myControl.BorderStyle = BorderStyle.None;

并且,类似于 Blabblablaster 所说的,考虑使用 FlowLayoutPanel 并将您的 Label 控件添加到其中。您可以将上面的代码放在一个循环中,将每个代码添加到面板中,它会为您将它们彼此相邻放置。

for (var i = 0; i < 10; i++)
{
    Label myControl = new Label();
    myControl.Text = "TEXT";
    ...
    ...
    flowLayoutPanel1.Controls.Add(myControl);
}

【讨论】:

  • 我不明白...使用我发布的代码(删除 Padding 和 Margin 定义)并将 FlatStyle 从 System 切换到 Standard 给了我相同的结果.. 你能发布你的代码吗请用看看它是否对我有用?
  • 我试图在这个答案中获得第二个窗口(但有边框):stackoverflow.com/a/3630031/1756496 但我似乎只能获得第一个窗口。这可能是操作系统干扰。 .
  • 这是操作系统干扰。我在 Win7 中尝试过这个(之前使用的是 XP),我得到了我想要的行为,使用 FlatStyle.Standard。谢谢!
【解决方案2】:

这就是为我解决的问题(使用@LarsTech 的解决方案):

我加了

    protected override void OnHandleCreated(EventArgs e) {
        base.OnHandleCreated(e);
        this.AutoSize = false;
    }

    protected override void OnFontChanged(EventArgs e) {
        base.OnFontChanged(e);
        this.Size = GetTextSize();
    }

    protected override void OnResize(EventArgs e) {
        base.OnResize(e);
        this.Size = GetTextSize();
    }

    protected override void OnTextChanged(EventArgs e) {
        base.OnTextChanged(e);
        this.Size = GetTextSize();
    }

    private Size GetTextSize() {
        Size padSize = TextRenderer.MeasureText(".", this.Font);
        Size textSize = TextRenderer.MeasureText(this.Text + ".", this.Font);
        return new Size(textSize.Width - padSize.Width, textSize.Height);
    }

到我的标签定义。

我也加了

textLabel.FlatStyle = FlatStyle.System;

非常感谢您的帮助!

【讨论】: