我试图在桌面应用程序中创建一些滚动文本(选取框)。我最初尝试使用计时器刻度,但由于刻度之间的时间可能不可靠,因此导致动画不稳定。我现在正在尝试使用WPF原生动画。
我在TextBlock
内放置了Canvas
。我可以使用标准DoubleAnimation
轻松滚动文本。
var MyAnimation = new DoubleAnimation()
{
From = this.ActualWidth,
To = -MyTextBlock.ActualWidth,
Duration = new Duration(TimeSpan.FromMilliseconds(15000))
};
MyTextBlock.BeginAnimation(Canvas.LeftProperty, MyAnimation);
这会导致我的默认文本块以可读的速度在屏幕上滚动,直到它消失。
我的问题是文本块内文本的长度会定期更改。这会导致问题,因为较小的文本现在非常缓慢地穿过屏幕,但是大文本过去了。这是因为持续时间没有变化。
我将在运行时知道应用程序和文本块的宽度(以像素为单位)。我试图计算两者之间的比例,这可以让我计算出适当的持续时间但是它绝对不准确。
var span = Convert.ToInt32((((double)textwidth / appwidth) * 1000) * 10);
...
Duration = new Duration(TimeSpan.FromMilliseconds(span))
是否有建议的方法让文本块以稳定的速度在屏幕上移动,无论文本的长度如何?
这是我的意思的一个视觉例子
观察文本长度增加时的外观,但持续时间保持不变。文本越长越快。
我无法根据应用的宽度和文字的长度来弄清楚你如何自动计算持续时间。
(忽略生涩的滚动,它是一个15fps的GIF,它实际上是黄油般的光滑)
答案 0 :(得分:1)
您希望持续时间基于textWidth + appWidth
,而不是textWidth / appWidth
。选框移动的总距离是屏幕宽度加上文本块的宽度,而不是两者的比例。
答案 1 :(得分:0)
所需的公式是:
时间=距离/速度
我展示的代码变为:
double speed = 200.0;
var MyAnimation = new DoubleAnimation()
{
From = this.ActualWidth,
To = -MyTextBlock.ActualWidth,
Duration = new Duration(
TimeSpan.FromSeconds(
Math.Abs(
this.ActualWidth - MyTextBlock.ActualWidth) / speed))
};
MyTextBlock.BeginAnimation(Canvas.LeftProperty, MyAnimation);
现在,无论宽度如何,块都以相同的速度在屏幕上移动。