我的应用程序在其表面上有许多控件,并且更多是在运行时动态添加的。
尽管我使用选项卡来限制显示的控件数量以及双缓冲,但当它必须重新绘制(调整大小、最大化等)时,它仍然会闪烁和卡顿。
您有哪些提高 WinForms 应用程序性能的提示和技巧?
我的应用程序在其表面上有许多控件,并且更多是在运行时动态添加的。
尽管我使用选项卡来限制显示的控件数量以及双缓冲,但当它必须重新绘制(调整大小、最大化等)时,它仍然会闪烁和卡顿。
您有哪些提高 WinForms 应用程序性能的提示和技巧?
我知道你可以做两件事,但它们并不总是适用于所有情况。
如果您对每个控件 (myNewlyCreatedButton.Location.X/Y) 使用绝对定位,而不是使用流布局面板或表格布局面板,您将获得更好的性能。WinForms 需要做的数学运算要少得多,试图找出控件应该放在哪里。
如果您在单个操作中添加/删除/修改大量控件,请在受影响控件的容器(无论是面板还是整个表单)上调用“SuspendLayout()”,并且当您'在同一个面板上重新完成您的工作调用“ResumeLayout()”。如果不这样做,则每次添加/删除/修改控件时,表单都必须进行布局传递,这会花费更多时间。请参阅:http: //msdn.microsoft.com/en-us/library/system.windows.forms.control.suspendlayout (VS.80).aspx
虽然,我不确定这些方法在调整窗口大小时如何应用。
虽然比其他一些技巧更通用,但这是我的:
当使用大量“项目”时,尽量避免为每个项目创建一个控件,而是重用这些控件。例如,如果您有 10 000 个项目,每个项目对应一个按钮,那么(以编程方式)创建 10 000 个按钮并连接它们的事件处理程序非常容易,这样当您输入事件处理程序时,您就可以准确地知道哪个元素你必须努力。但是,如果您创建 500 个按钮(因为您知道任何时候只有 500 个按钮在屏幕上可见)并在按钮和项目之间引入一个“映射层”,它会更有效每次用户执行某些操作会导致更改应该可见的按钮集(例如移动滚动条)时,将按钮重新分配给不同的项目。
虽然,我不确定这些方法在调整窗口大小时如何应用。
处理 ResizeBegin 和 ResizeEnd 事件以调用 SuspendLayout() 和 ResumeLayout()。这些事件仅在 System.Windows.Form 类上(尽管我希望它们也在 Control 上)。
你在善用SuspendLayout()
andResumeLayout()
吗?
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.suspendlayout(VS.80).aspx