1

我在窗体上显示的事件之后添加控件。尽管我调用了SuspendLayout(). 如何让布局暂停,以便控件仅在全部加载完成时显示?

 public partial class ControlCreateTest : Form
{
    public ControlCreateTest()
    {
        InitializeComponent();       
    }

    private void AsyncControlCreateTest_Shown(object sender, EventArgs e)
    {
        CreateControls();
    } 

    private void CreateControls()
    {
        SuspendLayout();
        int startPoint= 0;            
        for (int i = 0; i < 4; i++)
        {          
            UserControl control = new UserControl() { Text = i.ToString(), Height = 100, Width = 100 };
            control.Load += control_Load;
            Controls.Add(control);
            control.Top = startPoint;
            startPoint += control.Height;
        }

        ResumeLayout();
        Text = "Loading complete";
    }

    void control_Load(object sender, EventArgs e)
    {
        Thread.Sleep(500);
        RichTextBox newRichTextBox = new RichTextBox() { Height = 100, Width = 100 };
        UserControl control = sender as UserControl;
        control.Controls.Add(newRichTextBox);
        newRichTextBox.Text = "loaded";
    }     
}

更新
似乎一旦这些表单开始加载......可见性和挂起调用立即被抛出窗口。当 Load 事件长时间运行时,这是相当麻烦的。

4

2 回答 2

1

在开发者的默默无闻中受到一点攻击Winforms。无论如何...我在构造函数中将表单的宽度和高度设置为 1 像素。当调用显示时,我隐藏窗口并将窗口恢复到正常大小。在隐藏之前很难注意到这个小窗口。

这让我的例程启动并加载表单显示而不会令人头疼。

更新
当使用 ShowDialogue() 时,这个愚蠢的小技巧只有在 Form_Shown 将控制权返回给调用者之前设置 Visible = true 才有效。我发现如果您在 Form.Shown 中设置 Visible = true ,则将触发 Closing 事件...伙计,我喜欢 WINFORMS ....

于 2012-11-02T17:51:14.653 回答
0

尝试使用 AddRange 一次添加所有控件:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.addrange.aspx

于 2012-11-02T16:33:24.567 回答