在Silverlight中计算字幕类型动画的速度

时间:2011-01-20 12:16:55

标签: silverlight algorithm animation silverlight-4.0 marquee

我有一个StackPanel元素,我在其上添加了HyperLinkBut​​ton控件,一个元素用于返回IEnumerable中的每个元素。此StackPanel包含在Canvas元素中。

一旦我填充了StackPanel,我就会运行一个动画来更改Canvas.Left属性,使超链接从左向右滚动。我的XAML就像:

<Canvas Height="20" VerticalAlignment="Stretch" x:Name="canvasInfo">
  <Canvas.Resources>
    <Storyboard x:Name="storyBoardMarquee">
      <DoubleAnimation x:Name="marquee" BeginTime="00:00:00" Storyboard.TargetName="spMarquee" Storyboard.TargetProperty="(Canvas.Left)" From="0"/>
    </Storyboard>
  </Canvas.Resources>
  <StackPanel Orientation="Horizontal" x:Name="spMarquee" >
    <StackPanel.Resources>
      <Style TargetType="HyperlinkButton">
        <Setter Property="Margin" Value="200,0,0,0"/>
      </Style>
    </StackPanel.Resources>
  </StackPanel>
</Canvas>

然后我有一个函数,一旦我使用HyperLinkBut​​tons填充StackPanel,我就会调用它,

//Start with element off screen to right, scroll until off left
marquee.From = canvasInfo.ActualWidth;
marquee.To = -spMarquee.ActualWidth;

我遇到的问题是我无法为动画的持续时间锻炼合适的算法。无论我尝试什么都不一致(例如,1个元素移动太快,30个元素移动太慢)。

有没有人有任何建议来计算这个动画的持续时间,我猜它与StackPanel的宽度和元素的数量有关,但我不能得到任何合适和一致的东西。

1 个答案:

答案 0 :(得分:3)

公式为:

  • 时间=距离/速度

选择100像素/秒的速度并将其插入:

double speed = 100.0;
marquee.Duration = new Duration(TimeSpan.FromSeconds(Math.Abs(marquee.From.Value - marquee.To.Value) / speed));