我正在使用Visual Studio表单设计器为我的Windows桌面应用程序初始布局表单。以下是该表单自动生成的InitializeComponent()
方法内容的摘要:
// ...
this.Controls.Add(this.menuStrip1);
this.Controls.Add(this.panel1);
this.MainMenuStrip = this.menuStrip1;
this.Name = "Form1";
this.Text = "Form1 Title";
this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout();
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
// ...
我想要做的是在启动过程中注入一个移动,调整大小和初始化窗体及其几个控件的过程。我相信,在第一次致电ResumeLayout()
之前,理想的地方就是这样做。
方便的是,我发现我可以覆盖表单的Text Property
:
public override String Text
{
set
{
if (!this.formInitialized)
{
DoSpecialFormInitialization();
this.formInitialized = true;
}
base.Text = value;
}
}
虽然我发现这种方法确实有效,但我觉得可能有更好的方法来实现我的目标。有没有更好的方法,最好是不需要更多努力的方法?
更新正如我在评论中回答@Grant Winney的回答时所知,我知道我可以在调用InitializeComponent()
之后在表单构造函数中进行初始化。但我试图避免重复对SuspendLayout()
和ResumeLayout()
的所有调用(请参阅InitializeComponent()
的内部),因为我认为这会降低性能并可能导致未来的维护问题。
不幸的是,仅仅在父表单上调用SuspendLayout()
和ResumeLayout()
就足够了。以下是@Grant引用an article(见第3段)的原因信息:
请记住,SuspendLayout仅阻止布局事件 为该特定控件执行。如果控件添加到a 例如,必须调用SuspendLayout和ResumeLayout 小组而不是父母表格。
答案 0 :(得分:1)
两个想法:
您可以从构造函数中调用方法来移动控件。这似乎更少" hacky",因为它不依赖于正在设置的表单上的某些其他属性的副作用。
(另外,如果有人在将来修改代码以在运行时更改窗口文本,他们会无意中再次运行初始化代码。)
public class MyForm : Form
{
public MyForm()
{
InitializeComponent();
DoSpecialFormInitialization();
}
}
谨慎使用。当表单在设计器中看起来是一种方式,然后在运行时以12种不同的方式之一时,维护变得非常困难。