Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 添加控件时如何使suspendlayout正常工作?_C#_Winforms - Fatal编程技术网

C# 添加控件时如何使suspendlayout正常工作?

C# 添加控件时如何使suspendlayout正常工作?,c#,winforms,C#,Winforms,我在窗体上显示的事件之后添加控件。尽管我调用了SuspendLayout()。如何使布局挂起,使控件仅在全部加载完成时显示 public partial class ControlCreateTest : Form { public ControlCreateTest() { InitializeComponent(); } private void AsyncControlCreateTest_Shown(object send

我在窗体上显示的事件之后添加控件。尽管我调用了
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";
    }     
}
公共部分类ControlCreateTest:表单
{
公共控制CreateTest()
{
初始化组件();
}
显示私有void AsyncControlCreateTest_(对象发送方,事件参数e)
{
CreateControls();
} 
私有void CreateControls()
{
SuspendLayout();
int起始点=0;
对于(int i=0;i<4;i++)
{          
UserControl=newusercontrol(){Text=i.ToString(),高度=100,宽度=100};
控制负荷+=控制负荷;
控件。添加(控件);
control.Top=startPoint;
startPoint+=控制点高度;
}
恢复布局();
Text=“加载完成”;
}
无效控件加载(对象发送器、事件参数)
{
睡眠(500);
RichTextBox newRichTextBox=newRichTextBox(){Height=100,Width=100};
UserControl=sender作为UserControl;
Controls.Controls.Add(newRichTextBox);
newRichTextBox.Text=“已加载”;
}     
}
更新

似乎一旦这些表单开始加载…可见性和挂起调用就会立即抛出窗口。当加载事件长时间运行时,这非常麻烦。

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


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


Winforms
dev的晦涩难懂让我有些恼火。不管怎样……我在构造函数中将窗体的宽度和高度设置为1像素。调用show时,我隐藏窗口并将窗口恢复到正常大小。在它被隐藏之前很难注意到这扇小窗户

这让我的例程启动并加载表单显示,而不会让我头痛

更新

当使用ShowDialogue()时,只有在所显示的表单将控件返回给调用方之前设置Visible=true,这个愚蠢的小把戏才会起作用。我发现如果你在表单中设置Visible=true。如图所示,关闭事件将被触发…伙计,我喜欢WINFORMS…

对WINFORMSdev的模糊性有点不满。无论如何,我在构造函数中将表单的宽度和高度设置为1像素。调用show时,我隐藏窗口并将窗口恢复到正常大小。在它被隐藏之前很难注意到这扇小窗户

这让我的例程启动并加载表单显示,而不会让我头痛

更新

当使用ShowDialogue()时,只有在所显示的表单将控件返回给调用方之前设置Visible=true,这个愚蠢的小把戏才会起作用。我发现,如果在表单中设置Visible=true。如图所示,将触发关闭事件…伙计,我喜欢WINFORMS…

我之前已经尝试过了。在这个测试用例中没有任何区别。我之前已经试过了。在这个测试用例中没有任何区别。是的,他们会一次画一个。因为长时间的睡眠而可见。布局和绘制完全不相关。SuspendLayout不会阻止它们显示和绘制,它会在每次添加控件时阻止布局引擎运行。布局引擎负责修改容器中控件的位置/大小属性,容器用于排列控件(如TableLayoutPanel)。当一次添加多个控件时,这非常有用,这样在添加完所有控件后,布局只发生一次。或者说,当在一个控件上分别更改宽度和高度时,可能会同时触发布局。是的,他们会一次绘制一个。因为长时间的睡眠而可见。布局和绘制完全不相关。SuspendLayout不会阻止它们显示和绘制,它会在每次添加控件时阻止布局引擎运行。布局引擎负责修改容器中控件的位置/大小属性,容器用于排列控件(如TableLayoutPanel)。当一次添加多个控件时,这非常有用,这样在添加完所有控件后,布局只发生一次。或者说,当在一个控件上分别更改宽度和高度时,可能会同时触发布局。