在 C# 应用程序中完成注册表单,如果我启用 AutoScroll 然后在滚动下方有一个文本框并单击它,我注意到面板会一直跳回顶部。有没有办法用一些代码来解决这个问题,或者它是一种礼仪?
用语言来解释对我来说有点困难,所以这里有一个简短的视频来展示这种行为。
我曾经也有过一样的问题。我在面板中使用以下代码修复了它:
protected override Point ScrollToControl(Control activeControl)
{
return this.AutoScrollPosition;
}
我有这个确切的问题。我不得不从表单上的面板中移除对接,这解决了问题。
由于显然以前没有人见过这种行为并且可以提供快速答案,因此我打开了 Visual Studio 来尝试重现您所描述的内容。
我创建了一个新的 WinForms 项目,其中GroupBox
包含一个Panel
其AutoScroll
属性设置为“True”的项目。然后,我在中添加了两个新GroupBox
控件,每个控件都包含两个控件。第一个嵌入在表单的顶部,在启动时完全可见;第二个嵌入在底部,必须滚动到视图中。从您的描述和视频中我可以看出,这相当于您所拥有的设计/布局。Panel
TextBox
GroupBox
GroupBox
但是,当我运行该项目时,向下滚动到第二个嵌入GroupBox
并选择TextBox
它包含的控件之一,它的执行完全符合预期。TextBox
我单击的控件获得焦点,而无需将整个面板滚动回顶部。我似乎无法重现您所看到的。如果您可以告诉我我在设计测试样本时做错了什么,或者发布重新创建您正在经历的行为所需的最小样本项目,我可能会提供帮助。
否则,这里有一些需要调查的建议:
表单上对象的 Tab 键顺序。这确实不应该导致所描述的行为,因为单击控件应该将焦点设置到该控件,无论其在选项卡顺序中的位置如何,并且在我的示例项目中多次混淆选项卡顺序仍然没有出现有同样的效果。但我认为无论如何都值得一试。在设计模式下,转到“查看”菜单,然后单击“标签顺序”。您可以为其设置 Tab 键顺序的所有控件的左上角都会有一个小彩色框,指示它们在每个容器中的 Tab 键顺序。要设置 Tab 键顺序,请按您希望它们聚焦的自然顺序在每个控件上单击一次。
搜索您的代码中的任何<Control>.Focus
或<Control.Select>
语句。确保您没有任何验证代码在运行时以任何方式更改选项卡顺序。这可能会导致焦点跳回位于顶部附近的控件Panel
,迫使它自动滚动到新位置。
尝试在一个全新的、干净的项目中重现该行为。理想情况下,在 Visual Studio 中创建一个新项目,并以与您在遇到困难的项目中完全相同的方式布置控件。这与我所做的相同,部分原因是我没有您的特定项目可以使用,还因为这是解决特别棘手的行为的最佳方法。更有可能是您的设计或源代码有一些怪癖导致了这种行为,而不是控件本身的某种错误。但无论哪种方式,这都会让您确切地知道问题发生在哪里,这将使您更接近解决方案。
您可以使用 TableLayoutPanel" 而不是 "Panel" 以避免滚动条改变其位置。