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)。当一次添加多个控件时,这非常有用,这样在添加完所有控件后,布局只发生一次。或者说,当在一个控件上分别更改宽度和高度时,可能会同时触发布局。