mousedown上的自动滚动问题

问题描述 投票:4回答:2

我在自动滚动面板中有一个自定义控件。当用户控件超出面板宽度时,会出现滚动条。当你随后滚动任何距离并在控件上进行mousedown时,滚动条会快速回到0.是否有人知道为什么会这样?我很确定我不是想在任何地方改变滚动条的值......

谢谢

编辑:这似乎只发生一次,第一次点击它,每隔一次它按预期工作

编辑2:当你打开一个新窗口,然后返回C#窗口时也会发生这种情况

c# .net mouse panel autoscroll
2个回答
1
投票

如果你有一个比它的容器宽得多的控件(如TextBox),你滚动到它的结尾,然后单击控件,你将滚动回到控件的Location

单击的控件获得焦点并自动滚动,这是winforms的标准行为。

如果你想否定它,你将不得不拦截容器的SetAutoScrollPositionScrollableControl)或使用其他机制恢复到原始位置。

如果控件已经具有焦点,然后滚动,再次单击它将不会更改容器的AutoScrollPosition


0
投票

我为VB.net做了这个。要尝试这个创建一个WinForms项目,并:

  1. 将Panel1放在Form1上,将TextBox1放在Panel1中。
  2. 使TextBox1比Panel1大,并用一堆文本填充它。
  3. 将Panel1.AutoScroll设置为true。
  4. 将Button1添加到Form1并将其TabIndex设置为0以抓住加载焦点。

运行项目,移动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
© www.soinside.com 2019 - 2024. All rights reserved.