【问题标题】:Autoscroll problem on mousedown鼠标按下时的自动滚动问题
【发布时间】:2011-06-26 10:28:08
【问题描述】:

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

谢谢

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

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

【问题讨论】:

    标签: c# .net mouse panel autoscroll


    【解决方案1】:

    我为 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
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      猜你喜欢
      • 2010-12-22
      • 2015-07-27
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多