winforms 无衬垫和边距的标签

4bbkushb  于 2023-06-24  发布在  其他
关注(0)|答案(2)|浏览(133)

我有以下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|
-----------

我错过了什么吗?先谢谢你了!
为了澄清,我需要在文本和边框之间没有空间。

zu0ti5jz

zu0ti5jz1#

这是为我解决的问题(使用@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;

非常感谢您的帮助!

wmvff8tz

wmvff8tz2#

我不知道FlatStyle属性是怎么回事,只能说FlatStyle.System对我的系统有类似的影响。其他FlatStyle值清楚地表明了对控件的影响,但FlatStyle.System非常模糊。
控件的外观由用户的操作系统确定。
我不确定操作系统中的什么在控件的布局中起作用。LarsTech关于将其更改为FlatStyle.Standard(或任何其他值)的评论为我解决了这个问题 (并且不会删除任何文本,正如您的评论所示)
可以通过将对齐行为显式设置为中心来替代对齐行为:

myControl.TextAlign = ContentAlignment.MiddleCenter;

我不确定你到底想实现什么 (因为似乎你可以只在一个 * Label中输入所有文本, 而不是多个彼此相邻)*,但你可能还想删除边框样式:

myControl.BorderStyle = BorderStyle.None;

而且,类似于Blablablaster所说的,考虑使用FlowLayoutPanel并将Label控件添加到其中。你可以把上面的代码放在一个循环中,把每一个都添加到面板中,它会为你把它们一个接一个地安排好。

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

相关问题