Скорость разработки для анимации типа "шатер" в Silverlight - PullRequest
1 голос
/ 20 января 2011

У меня есть элемент 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>

У меня есть функция, которую я вызываю после заполнения StackPanel с помощью HyperLinkButtons,

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

Проблема, с которой я сталкиваюсьявляется то, что я не могу выработать подходящий алгоритм для продолжительности анимации.Все, что я пытаюсь сделать, не соответствует (например, 1 элемент движется слишком быстро, 30 элементов движется слишком медленно).

Есть ли у кого-нибудь какие-либо предложения по определению продолжительности этой анимации, полагаю, она должнас шириной StackPanel и количеством элементов, но я просто не могу получить ничего подходящего и последовательного.

1 Ответ

3 голосов
/ 21 января 2011

Формула:

  • время = расстояние / скорость

Выберите скорость, например, 100 пикселей в секунду, и подключите ее:

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