2011-01-20 2 views
1

У меня есть элемент StackPanel, на который я добавляю элементы управления HyperLinkButton, по одному для каждого элемента в возвращаемом IEnumerable. Эта StackPanel содержится в элементе Canvas.Скорость разработки для анимации шатер в Silverlight

Как только я заполнил 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; 

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

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

+0

мое первое впечатление, что оно действительно с помощью StackPanel, поскольку по умолчанию это «сжатие» вокруг элементов. Пробовали ли вы использовать контейнер с фиксированным размером и, если нужно, настроить ширину, как часть анимации? –

ответ

3

Формула:

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

Выберите скорость как 100 пикселей/секунду и вставить его в:

double speed = 100.0; 
marquee.Duration = new Duration(TimeSpan.FromSeconds(Math.Abs(marquee.From.Value - marquee.To.Value)/speed)); 
Смежные вопросы