【问题标题】:Windows Forms: preserving scroll position after redrawWindows 窗体:重绘后保留滚动位置
【发布时间】:2026-01-06 14:50:01
【问题描述】:

我正在 Windows 窗体中构建一个简单的图像浏览器/查看器应用程序。

主窗体包含一个启用了 AutoScroll 的 Panel 控件,以便为主应用程序 MenuStrip 下方的图像创建一个可滚动的内容区域。

在这个面板中动态放置了一个或多个我定义的 UserControl 对象。每一个都包含一个 GroupBox(为每组缩略图显示一个标题),它又包含一些按钮和一个 FlowLayoutPanel,其中填充了一个或多个显示图像缩略图的 PictureBox 对象。

可以单击每个缩略图以全尺寸打开所选图像,或者在应用程序窗口中尽可能靠近它。这是通过动态生成一个占据整个窗口的 PictureBox 控件来实现的,该控件的 z-index 值使其显示在缩略图网格上方,从而使其模糊。

我遇到的问题是,当我创建和销毁覆盖的 PictureBox 控件时,包含缩略图的底层 Panel 控件会自行重绘,这会将其滚动位置重置为顶部,如果您之前向下滚动到全部。

奇怪的是,有时滚动位置会被保留,我无法确定一种模式来解释不一致的行为。

谁能提出一个巧妙的解决方案来防止这种情况发生?还是我需要检查面板的滚动位置并在重绘后以编程方式将其设置回相同的值?

【问题讨论】:

  • 您找到这个问题的答案了吗?我有一个类似的问题,试图在重绘后坚持一个充满自定义控件的 flowlayoutpanel 的滚动位置。

标签: .net winforms scroll redraw


【解决方案1】:

听起来面板不是必需的。我猜你已经将 FlowLayoutPanel 的 AutoSize 设置为 true。

尝试仅使用 FlowLayoutPanel,因为它会为您提供默认 AutoSize = false 的滚动。

【讨论】:

  • 谢谢,但小组是必要的 - 我已经编辑了问题以阐明我正在使用的对象的层次结构。
  • @BestMamguEver 但是 FlowLayoutPanel 是可滚动的。为什么不使用它?
  • 因为我希望应用程序窗口包含多组缩略图,每组都有自己的一组标签和关联的控件,但我不想要多个滚动条 - 只是在侧面的一个主窗口
  • @BestMamguEver 图片可能会有所帮助。
  • 好的,this is the custom UserControl。 FLowLayoutPanel 本身就是当前选中的那个。我将在主窗口中有一个或多个这样的控件,并且希望任何滚动都由主窗口的滚动条来处理。
最近更新 更多