为什么当表单失去焦点并重新获得焦点时,我的 FlowLayoutPanel 会自动滚动回顶部?
Why does my FlowLayoutPanel automatically scroll back to the top when the form loses and regains focus?
我正在创建一个图像浏览器,它使用 FlowLayoutPanel
来显示图像的缩略图。查看显示我如何向下滚动面板的动画 GIF,切换到另一个 window,然后返回导致 FlowLayoutPanel
滚动回顶部的表单。我无法想象它为什么会这样做。
此外,我似乎可以通过单击面板来设置滚动位置。当表单失去焦点并重新获得焦点时,它会滚动回到我单击的最后一个 Y 位置。
为什么它会出现这种行为,我该如何防止它发生?
所描述的效果很常见:当 FlowLayoutPanel 包含可以激活的控件并且这些子控件之一在某个点被选中时(在本例中是具有 WS_EX_CONTROLPARENT
扩展样式的 UserControl,所以 SetStyle(ControlStyles.Selectable, false) won't do much) and the FlowLayoutPanel is then scrolled to hide this Control, when the Form is deactivated and then activated again, the 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
事件之外,这没有任何有意义的副作用。
它也可以用来暂停其他一些 activity,因为用户现在正在关注另一个 Window.
▶ 要将 ActiveControl 设置为默认控件(首次显示表单时激活的控件),请设置 this.ActiveControl = null;
。再次激活表单时会重置。
我有时看到 Activated
和 Deactivate
事件用于禁用和启用 ContainerControl:当然,这也可以防止滚动,但是当子控件时可能会导致不需要的级联效果被禁用。
但它也可能是预期和可能需要的东西。这取决于幕后发生的事情(实施细节)。
提出的解决方案也可以工作,从 FlowLayoutPanel 派生自定义控件。这取决于用例。
我正在创建一个图像浏览器,它使用 FlowLayoutPanel
来显示图像的缩略图。查看显示我如何向下滚动面板的动画 GIF,切换到另一个 window,然后返回导致 FlowLayoutPanel
滚动回顶部的表单。我无法想象它为什么会这样做。
此外,我似乎可以通过单击面板来设置滚动位置。当表单失去焦点并重新获得焦点时,它会滚动回到我单击的最后一个 Y 位置。
为什么它会出现这种行为,我该如何防止它发生?
所描述的效果很常见:当 FlowLayoutPanel 包含可以激活的控件并且这些子控件之一在某个点被选中时(在本例中是具有 WS_EX_CONTROLPARENT
扩展样式的 UserControl,所以 SetStyle(ControlStyles.Selectable, false) won't do much) and the FlowLayoutPanel is then scrolled to hide this Control, when the Form is deactivated and then activated again, the 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
事件之外,这没有任何有意义的副作用。
它也可以用来暂停其他一些 activity,因为用户现在正在关注另一个 Window.
▶ 要将 ActiveControl 设置为默认控件(首次显示表单时激活的控件),请设置 this.ActiveControl = null;
。再次激活表单时会重置。
我有时看到 Activated
和 Deactivate
事件用于禁用和启用 ContainerControl:当然,这也可以防止滚动,但是当子控件时可能会导致不需要的级联效果被禁用。
但它也可能是预期和可能需要的东西。这取决于幕后发生的事情(实施细节)。