c#锚定控件”;抖动”;同时调整大小

本文关键字:调整 抖动 控件 | 更新日期: 2023-09-27 18:00:16

我的应用程序上有一个控件,用户可以调整它的大小,它的右上角有一些按钮,还有一个滚动条
问题是,当调整控件的大小时,锚定在右侧的控件也会更改位置,只有在几毫秒后,控件才会进入正确的位置。因此,在调整父控件的大小时,看起来子控件"抖动"。

我已经尝试了各种方法,比如在父控件上使用SuspendLayoutResumeLayout,在每个控件上设置双缓冲和其他样式为true,设置WS_EX_COMPOSITED位,但似乎没有什么能解决这个问题
这个问题也出现在其他应用程序上,非常烦人。

那么,有没有办法在.net上解决这个问题呢
也许让它把所有东西都渲染到后台缓冲区,然后当所有东西都完成时,把它渲染到屏幕上?

c#锚定控件”;抖动”;同时调整大小

我会创建一个新的事件,在调整大小完成后触发,使用一个小的定时器魔术,在每个调整大小事件上以大约50毫秒的间隔停止和启动一个定时器,你可以创建这种假ResizeEnd类型的事件。

在第一次调整大小事件中,我会使用dllimport调用(不记得是哪一个)停止绘制UI,以停止绘制窗口或控件的内容。然后,当调整大小完成时,使用相同的dllimport调用再次启用绘图。

效果是,它只会在调整大小后重新绘制自己,或者如果在调整大小时暂停,则每50ms重新绘制一次。

ResizeEnd:WinForms-调整大小事件后的操作

SuspendDrawing:如何暂停控件及其子对象的绘画?

使用System.Drawing覆盖命名空间中的以下虚拟方法

  protected override Point ScrollToControl(Control activeControl)
    {
        return AutoScrollPosition;
    }

应该解决问题!