【问题标题】:Why does my FlowLayoutPanel automatically scroll back to the top when the form loses and regains focus?为什么当表单失去焦点并重新获得焦点时,我的 FlowLayoutPanel 会自动滚动回顶部?
【发布时间】:2021-07-21 23:09:30
【问题描述】:

我正在创建一个使用FlowLayoutPanel 来显示图像缩略图的图像浏览器。请参阅动画 GIF,它显示了我如何向下滚动面板、切换到另一个窗口,然后返回到导致 FlowLayoutPanel 滚动回顶部的表单。我无法想象它为什么会这样做。

另外,我似乎可以通过单击面板来设置滚动位置。当表单失去焦点并重新获得焦点时,它会滚动回我单击的最后一个 Y 位置。

为什么会出现这种行为,我该如何防止它发生?

【问题讨论】:

  • 这些控件(缩略图)是否有某种焦点?...导致它跳回任何焦点控件?
  • @Idle_Mind 看起来像。所有这些图标都是包含 PictureBox 和标签的自定义控件。我在控件本身上处理了GotFocus 事件,当我单击它时它被触发。不过,我想知道为什么它只在表单失去/重新获得焦点时才想要滚动回具有焦点的控件
  • @Idle_Mind 我还要补充一点,除非我首先与流程面板中的某些内容进行交互,否则它不会表现出这种行为。
  • 也许可以尝试扩展 FlowLayoutPanel 并覆盖 ScrollToControl(Control activeControl) 方法,例如:stackoverflow.com/questions/32512355/…
  • @Loathing 我会认为这是最后的手段。真的不想通过创建一个从 FlowLayoutPanel 继承的控件来重构我的表单和 c# 中的代码,只是为了覆盖单个属性。

标签: c# .net winforms flowlayoutpanel


【解决方案1】:

描述的效果很常见:当 FlowLayoutPanel 包含可以激活的控件并且在某些时候选择了其中一个子控件时(在本例中为 UserControl,它具有 WS_EX_CONTROLPARENT 扩展样式,因此 SetStyle(ControlStyles.Selectable, false)不会做太多),然后滚动 FlowLayoutPanel 以隐藏此控件,当 Form 被停用然后再次激活时,ActiveControl 滚动到视图中。

这会导致 FlowLayoutPanel 滚动到子 ActiveControl 可见的位置。

▶ 当子控件不可选择时不会发生这种情况,例如 PictureBox 控件。如果这个控件用于显示缩略图(如问题所示),FlowLayoutPanel 将不会滚动。

我认为防止 FlowLayoutPanel 滚动到 ActiveControl 的最简单方法是在 Form 停用时将 FlowLayoutPanel 本身设置为 ActiveControl,处理 Deactivate 事件。

private void form1_Deactivate(object sender, EventArgs e)
{
    this.ActiveControl = this.flowLayoutPanel1;
}

这没有有意义的副作用,除了以前是 ActiveControl 的控件将引发 Leave 事件。
它也可以用来暂停其他一些活动,因为用户现在正专注于另一个窗口。

▶ 要将 ActiveControl 设置为默认值(第一次显示表单时激活的控件),请设置 this.ActiveControl = null;。再次激活表单时会重置。

我有时会看到 ActivatedDeactivate 事件用于禁用和启用 ContainerControl:当然,这也可以防止滚动,但在禁用子控件时可能会导致不需要的级联效果。
但这也可能是预期的,也可能是期望的。这取决于幕后发生的事情(实现细节)。

@Loathing in comments 提出的解决方案也可以,从 FlowLayoutPanel 派生一个自定义控件。这取决于用例。
Stop form from scrolling when moving controls

【讨论】:

  • 是的,到目前为止,您的解决方案运行良好。不再烦人的自动滚动。将来,如果我有其他想要保持焦点的控件,我将检查这些控件中是否有任何控件具有焦点,在 Deactivated 事件期间存储对该控件的引用,然后将其设置回活动控件启用。当我到达时会越过那座桥,但我相信它会起作用。
猜你喜欢
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多