我在自动滚动面板中有一个自定义控件。当用户控件超出面板宽度时,会出现滚动条。当你随后滚动任何距离并在控件上进行mousedown时,滚动条会快速回到0.是否有人知道为什么会这样?我很确定我不是想在任何地方改变滚动条的值......
谢谢
编辑:这似乎只发生一次,第一次点击它,每隔一次它按预期工作
编辑2:当你打开一个新窗口,然后返回C#窗口时也会发生这种情况
如果你有一个比它的容器宽得多的控件(如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