Winforms 为什么我的FlowLayoutPanel会在表单失去焦点并重新获得焦点时自动滚动回顶部?

Winforms 为什么我的FlowLayoutPanel会在表单失去焦点并重新获得焦点时自动滚动回顶部?,winforms,flowlayoutpanel,Winforms,Flowlayoutpanel,我正在创建一个图像浏览器,它使用FlowLayoutPanel显示图像的缩略图。请参阅动画GIF,其中显示了我如何向下滚动面板,切换到另一个窗口,然后返回到导致FlowLayoutPanel滚动回顶部的表单。我无法想象它为什么会这样做 此外,我似乎可以通过单击面板来设置滚动位置。当窗体失去焦点并重新获得焦点时,它会回滚到我单击的最后一个Y位置 为什么它会表现出这种行为?我怎样才能防止它的发生 所描述的效果非常常见:当FlowLayoutPanel包含可以激活的控件并且在某个点上选择了其中一个子控

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

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

为什么它会表现出这种行为?我怎样才能防止它的发生


所描述的效果非常常见:当FlowLayoutPanel包含可以激活的控件并且在某个点上选择了其中一个子控件时(在本例中是UserControl(具有
WS\u EX\u CONTROLPARENT
扩展样式,因此不会有太多作用)-然后滚动FlowLayoutPanel以隐藏此控件,当窗体被停用然后再次激活时,将滚动到视图中。
这会导致FlowLayoutPanel滚动到子ActiveControl可见的位置

► 如果无法选择子控件(例如PictureBox控件),则不会发生这种情况。如果此控件用于显示缩略图(如问题所示),FlowLayoutPanel将不会滚动

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

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

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

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

@loating在注释中提出的解决方案也可以工作,从FlowLayoutPanel派生一个自定义控件。这取决于用例。

执行这些控件中的任何一个(缩略图)有某种焦点?…使它跳回任何被聚焦的控件?@Idle\u Mind看起来是这样的。所有这些图标都是自定义控件,包含一个PictureBox和一个标签。我在控件本身上处理了
GotFocus
事件,当我单击它时,它就会触发。不过,我想知道它为什么要滚动回co仅当窗体丢失/恢复时才具有焦点的控件focus@Idle_Mind我还要补充一点,除非我首先与flow panel中的某些内容交互,否则它不会显示这种行为。可能尝试扩展
FlowLayoutPanel
并覆盖
滚动控件(Control-activeControl)< /代码>方法,例如:“厌恶”,我将把它当作最后的手段。不希望通过在FlowLayoutPanel中继承一个控件来重写单个属性,而不是真的想重构我的窗体和C语言中的代码。YEP,到目前为止,您的解决方案工作得很好。没有更烦人的自动滚动。o保持焦点,我将检查这些控件中是否有任何控件具有焦点,在停用事件期间存储对控件的引用,然后在激活时将其设置回活动控件。当我到达它时,我将跨越该桥,但我确信它会工作。
private void form1_Deactivate(object sender, EventArgs e)
{
    this.ActiveControl = this.flowLayoutPanel1;
}