Marquee不会顺利移动

时间:2014-03-15 08:35:17

标签: c# wpf marquee

我为自己创建了一个小型原型。它将标签从屏幕的右边缘移动到左侧。在那里,它再次从右边开始,使它看起来无限。就像新闻报道一样。

我的问题是,标签的位置非常颤抖。它看起来粗鲁而坎坷。我将标签每33毫秒移动到左边的1.0。

我的渲染器在硬件端运行(第2层)。 框架:4.5

XAML:

<Window x:Class="Canny.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="811" Name="main">
<Canvas Name="myCanvas" Background="Black">
    <Label Name="lb1" Content="Lauftext+++" Foreground="WhiteSmoke" FontSize="25" Canvas.Left="618" Canvas.Top="10" FontFamily="Courier New" FontWeight="ExtraBold" FontStretch="UltraExpanded"/>
</Canvas>

XAML.CS:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Threading;

namespace Canny
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    DispatcherTimer timer;
    double newPos;
    readonly double actualWidthLb;
    int renderingTier;
    public MainWindow()
    {
        InitializeComponent();
        timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromMilliseconds(33.0);
        timer.Tick += timer_Tick;
        newPos = myCanvas.ActualWidth;
        actualWidthLb = lb1.ActualWidth;
        timer.Start();
        renderingTier = (RenderCapability.Tier >> 16);

    }

    void timer_Tick(object sender, EventArgs e)
    {
        newPos -= 1.0;
        Canvas.SetLeft(lb1,newPos);
        if (Canvas.GetLeft(lb1) + actualWidthLb <= 0)
        {
            Canvas.SetLeft(lb1, myCanvas.ActualWidth);
            newPos = myCanvas.ActualWidth;
        }
    }
}
}

我提前感谢您的建议!

1 个答案:

答案 0 :(得分:0)

您是否尝试降低计时器间隔? 33ms约为30Hz。这个速度太慢了,我们的眼睛不能像流动的画面那样经历。我们的眼睛比这快!这就是为什么你开始至少50Hz(20ms)的速度,但为了真正的平滑体验,你最好从70Hz开始,类似于14ms甚至更快。 (频率:f = 1 / T)。要调整滚动速度,您可以降低步数(例如,递增位置值x = x - 0.1 - >慢或x = x - 0.01 - >比将x递增-1.0慢100倍),反之亦然。

您可以考虑将DispatcherTimer与DispatcherPriority(通过构造函数)一起使用,优先级为Render或更高......

但是如果你使用WPF,为什么不使用提供的漂亮的动画功能呢?使用Blend可以快速轻松地完成它。 MSDN - How to: Animate an Object Along a Path (Double Animation)