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方法的建议,瞧,它很有效!
我对自定义控件还比较陌生,所以这是我的一个新手错误。这肯定会被长期铭记。
覆盖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;