我在自动滚动面板中有一个自定义控件。当用户控件超出面板的宽度时,会出现滚动条。然后,当您滚动任意距离并在控件上按下鼠标时,滚动条会回退到 0。有人知道为什么会这样吗?我很确定我不会尝试在任何地方更改滚动条的值...
谢谢
编辑:这似乎只发生一次,第一次点击它,每隔一次它按预期工作
编辑 2:当您打开一个新窗口然后返回 C# 窗口时也会发生这种情况
我在自动滚动面板中有一个自定义控件。当用户控件超出面板的宽度时,会出现滚动条。然后,当您滚动任意距离并在控件上按下鼠标时,滚动条会回退到 0。有人知道为什么会这样吗?我很确定我不会尝试在任何地方更改滚动条的值...
谢谢
编辑:这似乎只发生一次,第一次点击它,每隔一次它按预期工作
编辑 2:当您打开一个新窗口然后返回 C# 窗口时也会发生这种情况
如果您有一个比它的容器宽得多的控件(如 a TextBox
)并且您滚动到它的末尾,然后单击该控件,您将滚动回Location
该控件的。
单击的控件获得焦点并自动滚动,这是winforms的标准行为。
如果你想否定它,你将不得不拦截SetAutoScrollPosition
容器(ScrollableControl
)或使用其他机制恢复到原始位置。
如果控件已经具有焦点并且您然后滚动,则再次单击它不会更改AutoScrollPosition
容器的。
我为 VB.net 解决了这个问题。要尝试这样做,请创建一个 WinForms 项目并:
运行项目,移动 Panel1 滚动条,然后单击 TextBox1 中的一些文本。当 Panel1 试图将 TextBox 的左上角滚动到视图中时,TextBox1 会烦人地跳跃。现在将下面的代码放入 Form1 并重复测试。好看多了!这在 VB 2010 Express 中有效。
Delegate Sub AutoScrollPositionDelegate(ByVal sender As ScrollableControl, ByVal p As Point)
Private Sub TextBox1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Enter
Dim p As Point = Panel1.AutoScrollPosition
Dim del As AutoScrollPositionDelegate = New AutoScrollPositionDelegate(AddressOf SetAutoScrollPosition)
Panel1.BeginInvoke(del, {Panel1, p})
End Sub
Private Sub SetAutoScrollPosition(ByVal sender As ScrollableControl, ByVal p As Point)
p.X = Math.Abs(p.X)
p.Y = Math.Abs(p.Y)
sender.AutoScrollPosition = p
End Sub