我一直致力于开发将在我们的CRM前端中使用的自定义控件。控件本身并不特别,它只是将两个标签,文本编辑和一个按钮包装到一个控件中。 (该控件只是作为一个包装器,有点长,但很遗憾,由于各种限制,我们唯一的选择)
我虽然给控件一个Font和ForeColor属性会很好,这会改变标签的Font和Color。更改字体大小意味着要更改文本框的相对位置以使所有内容保持一致。没问题。
我将布局逻辑封装在UpdateLayout方法中,该方法在Font属性的set访问器上调用,并且一切都在设计时工作得很漂亮,但是,在运行时,标签的Font是正确的,但是布局是文本框和按钮仍处于默认位置,因此标签重叠。
在运行时初始阶段更新控件位置时我缺少什么?我试过从Initialize和控件的构造函数调用UpdateLayout()方法,唉也无济于事。
我错过了一些明显的东西吗?
编辑:
根据要求,我做了一个快速测试。我的测试控件看起来像这样(不包括Designer代码):
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();
}
}
在设计时效果很好,但运行时间不那么......
EDIT2:
所以上面的代码并没有完全准确地反映出这个问题,但是,我已经尝试过Jogy关于覆盖OnLayout方法的建议,并且看哪,它有效!
我对自定义控件相对较新,所以我的新手错误。这肯定会致力于长期记忆。
答案 0 :(得分:1)
覆盖OnLayout()
方法并在那里拨打UpdateLayout()
。
答案 1 :(得分:0)
感谢您提供代码,我会通过重用已有的控件来提供属性。
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"中使用它。可能使用空值。使用您的代码时,可能会将其更改为以下内容。
this.label1.Font = this.Font;