我有一个StackPanel元素,我在其上添加了HyperLinkButton控件,一个元素用于返回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>
然后我有一个函数,一旦我使用HyperLinkButtons填充StackPanel,我就会调用它,
//Start with element off screen to right, scroll until off left
marquee.From = canvasInfo.ActualWidth;
marquee.To = -spMarquee.ActualWidth;
我遇到的问题是我无法为动画的持续时间锻炼合适的算法。无论我尝试什么都不一致(例如,1个元素移动太快,30个元素移动太慢)。
有没有人有任何建议来计算这个动画的持续时间,我猜它与StackPanel的宽度和元素的数量有关,但我不能得到任何合适和一致的东西。
答案 0 :(得分:3)
公式为:
选择100像素/秒的速度并将其插入:
double speed = 100.0;
marquee.Duration = new Duration(TimeSpan.FromSeconds(Math.Abs(marquee.From.Value - marquee.To.Value) / speed));