4

我在自动滚动面板中有一个自定义控件。当用户控件超出面板的宽度时,会出现滚动条。然后,当您滚动任意距离并在控件上按下鼠标时,滚动条会回退到 0。有人知道为什么会这样吗?我很确定我不会尝试在任何地方更改滚动条的值...

谢谢

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

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

4

2 回答 2

1

如果您有一个比它的容器宽得多的控件(如 a TextBox)并且您滚动到它的末尾,然后单击该控件,您将滚动回Location该控件的。

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

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

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

于 2011-02-13T13:30:44.223 回答
0

我为 VB.net 解决了这个问题。要尝试这样做,请创建一个 WinForms 项目并:

  1. 在 Form1 上放置一个 Panel1,在 Panel1 内放置一个 TextBox1。
  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
于 2018-09-10T00:50:26.353 回答