在表单启动期间动态移动和初始化由表单设计器创建的表单元素

时间:2014-03-13 14:01:56

标签: c# winforms forms visual-studio-2010 visual-studio

我正在使用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   小组而不是父母表格。

1 个答案:

答案 0 :(得分:1)

两个想法:

  1. 您可以从构造函数中调用方法来移动控件。这似乎更少" hacky",因为它不依赖于正在设置的表单上的某些其他属性的副作用。

    (另外,如果有人在将来修改代码以在运行时更改窗口文本,他们会无意中再次运行初始化代码。)

    public class MyForm : Form
    {
        public MyForm()
        {
            InitializeComponent();
    
            DoSpecialFormInitialization();
        }
    }
    
  2. 谨慎使用。当表单在设计器中看起来是一种方式,然后在运行时以12种不同的方式之一时,维护变得非常困难。