为什么要使用SuspendLayout()方法?(C#)

56

我正在阅读关于SuspendLayout()ResumeLayout()的内容。我无法理解的是,为什么要这样做或使用它们。我知道当您在运行时向控件容器添加控件时使用它们。

这与设置DockAnchorLocation等属性有关。

但我不明白暂停布局和恢复布局的额外价值是什么。这些方法会处理什么?

1个回答

82

基本上,这是针对多个与布局相关的属性进行调整或添加多个子元素时,避免布局系统反复响应您的更改。 您希望在一切“准备就绪”之后,仅在最后执行布局。


2
我仍然不理解 SuspendLayout() 的作用。我的意思是,为什么要使用 SuspendLayout()?你也可以在不使用 SuspendLayout() 的情况下设置这些属性。 - Martijn
14
@Martijn: 是的,你可以设置它们... 布局系统将会浪费时间(并且可能使屏幕看起来很丑),在你设置各种属性时不断改变布局-而不是在你完成所有设置后一次性完成。假设你有一个复杂的布局,试图平均分配空间,然后你要添加100个项目... 你真的想让它在添加第一个项目后计算出空间,然后在添加第二个项目后计算,然后在添加第三个项目等等吗? - Jon Skeet
正如Jon Skeet所写:当您设置多个属性(或在GridView中插入多行)时,屏幕不会为每个单独的更改刷新,它只有在调用ResumeLayout时才会刷新。这样可以提高性能并避免屏幕闪烁。 - Mario The Spoon
@Mario:所以,您建议如果在GridView中插入多行,则应使用SuspendLayout()确保行可见? BindingList是否也在后台执行此操作? - Martijn
3
@Martijn:我会使用SuspendLayout(),但不是为了确保它们可见,而是为了(a)节省一些性能,因为屏幕不会在每个动作之后刷新 (b)避免屏幕上不必要的活动,比如闪烁等。BindingList是如何处理这个问题的,抱歉我不知道(因为我出于其他原因避免自动数据绑定)。 - Mario The Spoon
1
SuspendLayout() 肯定可以将我的调度组件渲染速度提高约25%。这有助于但并不能完全解决我的问题。 - GrahamJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接