1

我有一个 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 的宽度和元素的数量有关,但我无法得到任何合适和一致的东西。

4

1 回答 1

3

公式为:

  • 时间=距离/速度

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

double speed = 100.0;
marquee.Duration = new Duration(TimeSpan.FromSeconds(Math.Abs(marquee.From.Value - marquee.To.Value) / speed));
于 2011-01-21T07:36:50.953 回答