Перемещение объекта относительно его текущего местоположения в Expression Blend

Я новичок в Expression Blend 4, но у меня проблема с чем-то довольно простым.

Я хотел бы, чтобы кнопка перемещала объект вверх на 20 пикселей при каждом нажатии кнопки. Я следовал руководству здесь, который предполагает, что если вы используете анимацию раскадровки (без ключевого кадра в начале), которая перемещает объект, тогда он будет воспроизводить анимацию, перемещая ее, как и планировалось, из любого места объекта. в настоящее время (то есть: продолжать двигаться вверх при каждом нажатии), однако, когда я пытаюсь это сделать, анимация работает только один раз.

Я попытался установить флажок «использовать относительные значения» в меню преобразования, но это не имеет значения.

Я упускаю что-то очевидное?


person Stevemid    schedule 27.01.2012    source источник
comment
Вы имеете в виду, что вы хотите, чтобы он перемещался на 20 пикселей вверх каждый раз, когда вы нажимаете, или вы хотите, чтобы он возвращался в исходное местоположение и перемещался оттуда? Публикация кода тоже может помочь.   -  person Joel Cochran    schedule 27.01.2012
comment
Я хотел бы, чтобы он перемещался на 20 пикселей вверх (и на 20 пикселей влево) каждый раз, когда нажимается кнопка, и никогда не возвращался в исходное положение. <Storyboard x:Name="incorrect"> <DoubleAnimation Duration="0:0:0.8" To="-20" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="MySprite" d:IsOptimized="True"/> <DoubleAnimation Duration="0:0:0.8" To="-20" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="MySprite" d:IsOptimized="True"/> </Storyboard>   -  person Stevemid    schedule 27.01.2012
comment
Вы можете изменить свой вопрос, чтобы включить код. Это более читабельно, когда отформатировано.   -  person Walt Ritscher    schedule 31.01.2012


Ответы (1)


ПРИМЕЧАНИЕ: значения точек, о которых я здесь говорю, относятся к исходному местоположению объекта, а не к конкретным значениям точек.

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

Если вы на самом деле остановите анимацию, объект вернется к исходному значению (0,0). Проверьте это, добавив другую кнопку, которая вызывает остановку [для этого я использую поведение ControlStoryboardAction]. Вот пример, который вы можете использовать, чтобы проверить это:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
         xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
         mc:Ignorable="d"
         x:Class="Animation1.MainPage"
         Width="640"
         Height="480">
<UserControl.Resources>
    <Storyboard x:Name="Storyboard1">
        <DoubleAnimation Duration="0:0:0.8"
                         To="-20"
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
                         Storyboard.TargetName="rectangle"
                         d:IsOptimized="True" />
        <DoubleAnimation Duration="0:0:0.8"
                         To="-20"
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
                         Storyboard.TargetName="rectangle"
                         d:IsOptimized="True" />
    </Storyboard>
</UserControl.Resources>
<Grid x:Name="LayoutRoot"
      Background="White">
    <Button Content="Play"
            HorizontalAlignment="Left"
            Height="37"
            Margin="35,53,0,0"
            VerticalAlignment="Top"
            Width="65">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <ei:ControlStoryboardAction Storyboard="{StaticResource Storyboard1}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button>
    <Rectangle x:Name="rectangle"
               Fill="#FF0303FF"
               Height="99"
               Margin="275,0,207,57"
               Stroke="Black"
               VerticalAlignment="Bottom"
               RenderTransformOrigin="0.5,0.5">
        <Rectangle.RenderTransform>
            <CompositeTransform />
        </Rectangle.RenderTransform>
    </Rectangle>
    <Button Content="Stop"
            HorizontalAlignment="Left"
            Height="40"
            Margin="35,115,0,0"
            VerticalAlignment="Top"
            Width="65">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <ei:ControlStoryboardAction ControlStoryboardOption="Stop"
                                            Storyboard="{StaticResource Storyboard1}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button>
</Grid>

I think you are going to have to approach this particular problem differently. The easiest would be to place this in a Canvas and manage the Top and Left values (preferably through a binding). The idea would be to capture the storyboard completion and update the values in the binding and then Stop the animation. This should give the correct starting point for the next time the animation is Played. Sorry I don't have time to put this together, but hopefully this will get you farther along.

person Joel Cochran    schedule 27.01.2012
comment
Спасибо за ваш ответ. Я попытался добавить кнопку, чтобы остановить анимацию, как было предложено, и вы правы - объект возвращается в исходное положение. Такое поведение является неожиданным, потому что руководство, на которое я ссылался (собственно Microsoft), предполагает, что это не должно работать. Я не совсем уверен, что мои познания в Expression Blend соответствуют вашему предложению, но, по крайней мере, я на шаг ближе, спасибо. - person Stevemid; 31.01.2012