Winforms控件在运行时的布局

本文关键字:布局 运行时 控件 Winforms | 更新日期: 2023-09-27 18:21:34

我一直在开发一个自定义控件,该控件将用于我们的CRM前端。控件本身并没有什么特别之处,它只是将两个标签、文本编辑和一个按钮包装到一个控件中。(控件只是作为包装器,有点冗长,但不幸的是,由于各种限制,我们唯一的选择)

我认为给控件一个Font和ForeColor属性会很好,这会改变标签的Font和Color。更改字体大小意味着更改文本框的相对位置以使所有内容保持一致。没问题。

我将布局逻辑封装在UpdateLayout方法中,该方法在Font属性的set访问器上调用,在设计时一切都很好,但在运行时,标签的Font是正确的,但文本框和按钮的布局仍在默认位置,因此标签重叠。

在运行时的init阶段更新控件的位置缺少什么?我尝试过从Initialize和控件的构造函数调用UpdateLayout()方法,可惜没有用。

我是不是遗漏了一些显而易见的东西?

编辑:

按照要求,我做了一个快速测试。我的测试控件看起来是这样的(不包括设计器代码):

public partial class TestControl : UserControl
{
    private Font _font;
    [Browsable(true)]
    public override Font Font
    {
        get
        {
            return this._font ?? SystemFonts.DefaultFont;
        }
        set
        {
            this._font = value;
            this.DoLayout();
        }
    }
    private void DoLayout()
    {
        this.label1.Font = this._font;
        this.Size = new Size(label1.Width + textBox1.Width + 10,
            label1.Height >= textBox1.Height ? label1.Height : textBox1.Height);
        this.textBox1.Location = new Point(label1.Location.X + 5 + label1.Width, 1);
        this.Update();
    }
    public TestControl()
    {
        InitializeComponent();
    }
    protected override void OnLayout(LayoutEventArgs e)
    {
        base.OnLayout(e);
        DoLayout();
    }
}

这在设计时效果很好,但在运行时就不那么好了…

第2版:

因此,上面的代码并不能完全准确地反映问题,然而,我已经尝试了Jogy关于重写OnLayout方法的建议,瞧,它很有效!

我对自定义控件还比较陌生,所以这是我的一个新手错误。这肯定会被长期铭记。

Winforms控件在运行时的布局

覆盖OnLayout()方法并在那里调用UpdateLayout()

感谢您提供代码,我将通过重用现有控件来提供属性。

public override Font Font
{
    get { return this.label1.Font; }
    set 
    { 
        this.label1.Font = value; 
        // Additional code to update related controls.
    }
}

还要注意的声明

private Font _font; 

传递一个未初始化的变量,在"Do_Layout"中使用它可能会使用null值。在使用代码时,可能会将其更改为以下内容。

this.label1.Font = this.Font;