【问题标题】:How to implement smooth scrolling in .NET如何在.NET中实现平滑滚动
【发布时间】:2011-03-31 22:02:42
【问题描述】:

我想在 C# 中为自定义控件实现平滑/动画滚动。我想要类似于以下 javascript 示例的内容:

http://www.kryogenix.org/code/browser/smoothscroll/#p0

我的第一个想法是将滚动条移动到目标点,但停在中间点。例如,这是一个非常简单的想法:

public void SetSrollValue(int x)
{
    // assume right scrolling
    float step = x / 10;

    while (scroll.Value < x)
    {
        scroll.Value += step;
    }
}

我的问题是:

  • 我应该在线程中实现它吗?
  • 这是否会顺利绘制(如果我在控件中激活了双缓冲区,我想是的)

所以,如果您知道任何好的示例、文章、指南或类似内容,请您在此处提供链接吗?

提前致谢。

【问题讨论】:

  • 太模糊了。这是一种什么样的控制?只有当它派生自 ScrollableControl 并且您实现自己的 OnPaint() 方法时,您才能做一些合理的事情。让用户远离滚动条的控制权是不合理的。
  • @Hans:是的,我的控件是所有者绘制的,我实现了 OnPait(),还管理自己的滚动条。我只是在寻找一个指南,示例来实现平滑滚动。

标签: c# .net winforms scroll smooth-scrolling


【解决方案1】:

要使控件的内容滚动,请将 AutoScrollPosition 的值传递给 e.Graphics.TranslateTransform()。那是你的角度,改变你传递的值。

编写一个小助手类,使用您在 OnPaint 方法中调用的方法观察控件的 AutoScrollPosition 的值,传递 e.Graphics 以便您可以调用其 TranslateTransform 方法。当您看到它发生变化时,记录 Environment.TickCount,设置内部“scrollBusy”标志并启动 15 毫秒计时器。在每个计时器滴答声中,调用控件的 Invalidate() 方法,以便在再次调用方法时计算 TranslateTransform 的新值。计算从原始滚动位置到目标滚动位置的增量,例如 250 毫秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多