Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Как сделать мгновенное изменение кадра?


Автор: Dims 23.1.2011, 22:17
Изучил, как в Silverlight можно создавать storyboard-ы и в них накладывать ключевые точки с тем, чтобы система автоматически изображала плавную анимацию между ними.

А можно как-то, наоборот, сделать резкий переход?

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

Как это можно реализовать?

Автор: vikaz 23.1.2011, 22:44
Если Вам нужно зациклить анимацию, то у DoubleAnimationUsingKeyFrames есть свойство RepeatBehavior, который может принимать численное значение  повторений с префиксом x (1x, 2x, 3x...) или RepeatBehavior="Forever", тогда будет повторяться бесконечно.

Код, заставляет TextBlock опускаться вниз окна за 2с, потом резко возвращается в начало и все повторяется!
Код

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="WpfApplication12.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="640" Height="480">
    <Window.Resources>
        <Storyboard x:Key="OnLoaded1">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="textBlock" RepeatBehavior="2x">
                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:2" Value="448"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </Window.Resources>
    <Window.Triggers>
        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
            <BeginStoryboard Storyboard="{StaticResource OnLoaded1}"/>
        </EventTrigger>
    </Window.Triggers>

    <Grid x:Name="LayoutRoot">
        <TextBlock x:Name="textBlock" HorizontalAlignment="Left" Height="17" Margin="29,8,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="54" RenderTransformOrigin="0.5,0.5">
            <TextBlock.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform/>
                    <TranslateTransform/>
                </TransformGroup>
            </TextBlock.RenderTransform>
            
        </TextBlock>
    </Grid>
</Window>

Автор: Dims 27.1.2011, 17:09
Мне нужно не в начало вернуть, а сделать собственное произвольное преобразование.

Добавлено через 1 минуту и 8 секунд
Можно ли как-то отреагировать на окончание сториборда или на достижение определённого кадра?

Автор: exBlender 28.1.2011, 20:48
Эт, смотря какое "произвольное преобразование". Возможно, States помогут.

Автор: Dims 1.2.2011, 16:34
В общем, оказалось, что у сториборда есть событие Completed. В ответ на него я делаю необходимые изменения и, вроде бы, получается как надо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)