private int resizeTimeout = 0;
private Task resizeTask;
public void OnResize()
{
resizeTimeout = 300; //Reset timeout
//Only resize on completion. This after resizeTimeout if no interaction.
if (resizeTask == null || resizeTask.IsCompleted)
{
resizeTask = Task.Run(async () =>
{
//Sleep until timeout has been reached
while (resizeTimeout > 0)
{
await Task.Delay(100);
resizeTimeout -= 100;
}
ResizeControl();
});
}
}
private void ResizeControl()
{
if (this.InvokeRequired)
{
//Call the same method in the context of the main UI thread.
this.Invoke((MethodInvoker)delegate { ResizeControl(); });
}
else
{
// Do resize actions here
}
}
5条答案
按热度按时间yvgpqqbh1#
只需使用
ResizeEnd
事件:来自MSDN:
ResizeEnd事件在用户完成窗体大小调整(通常是通过拖动位于窗体右下角的一个边框或调整大小手柄,然后释放它)时引发。有关调整大小操作的更多信息,。
cvxl0en22#
您可以像下面这样伪造一个本地ResizeEnd:
间隔可以修改。间隔越大,在最后一次调整大小事件之后的延迟越长。
icomxhvb3#
如果您使用的是控件而不是窗体,并且希望在完成调整大小后(用户停止调整控件大小)执行操作,则可以使用另一个选项:
pnwntuvh4#
也许你可以使用SizeChanged事件,但是我不知道在调整大小的过程中多久或者什么时候调用它。
gz5pxeao5#
一个简单的解决方案是重写窗体中的OnResize并防止它调用基方法。
请改为在OnResizeEnd阶段开始时调用此基方法。
最大化或还原的表单只能在OnResize中检测。
为了适应这种情况,您需要跟踪窗口状态,并允许OnResize在窗口状态更改时继续执行:
另一方面,使用这样的代码应该是最后的手段。控件自然调整大小的问题通常表明设计/编码不好。