WPF вращать анимацию - PullRequest
       15

WPF вращать анимацию

2 голосов
/ 14 октября 2010

Я работаю с WPF и не могу добиться анимации.

У меня есть прямоугольник, который поворачивается на x градусов с началом преобразования преобразования от 0,0. Я хочу, чтобы этот прямоугольник поворачивался от y градусов с началом преобразования с помощью 0,1 с через 2 секунды.

Конечно, я хочу сохранить положение прямоугольника для второй анимации.

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

Есть идеи, как мне этого добиться?

Спасибо за помощь.

<Window x:Class="SimpleMove"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="OpenWWindow" Height="900" Width="900">
  <Grid >
    <Rectangle Name="rec1" Width="100" Height="400" Fill="DimGray" RenderTransformOrigin="0,0">
      <Rectangle.RenderTransform>
        <RotateTransform x:Name="Rec1_Rotate"/>
      </Rectangle.RenderTransform>
    </Rectangle>

    <Button Width="45" Height="30" Name="Button1">Start
      <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
          <EventTrigger.Actions>
            <BeginStoryboard>
              <Storyboard TargetProperty="Angle">                
                <DoubleAnimation Storyboard.TargetName="Rec1_Rotate" By="40" Duration="00:00:1" BeginTime="00:00:00"/>                                                
                <PointAnimation Storyboard.TargetName="rec1" Storyboard.TargetProperty="RenderTransformOrigin" To="0,1" Duration="00:00:0" BeginTime="00:00:02" />
                <DoubleAnimation Storyboard.TargetName="Rec1_Rotate" By="-80" Duration="00:00:2" BeginTime="00:00:03"/>
              </Storyboard>
            </BeginStoryboard>
          </EventTrigger.Actions>
        </EventTrigger>
      </Button.Triggers>
    </Button>
  </Grid>
</Window>

Ответы [ 2 ]

2 голосов
/ 15 октября 2010

RenderTransformOrigin относится к начальной точке, в данном случае, прямоугольника в окне. При вращении на основе точки (0,0) прямоугольник будет вращаться вокруг верхнего левого угла самого себя. Если вы измените RenderTransformOrigin, чтобы он теперь вращался вокруг (0,1), вы не вращаетесь сейчас, основываясь на левом нижнем углу прямоугольника в его текущей позиции, но вы вращаетесь на основе исходного положения прямоугольника. Мои мысли по этому поводу должны были бы установить начало трансформирования рендеринга в что-то вроде (0,0.5), чтобы получить искомое движение, которое вы ищете.

0 голосов
/ 14 октября 2010

Кажется, это то, что вы ищете, я использовал Microsoft Expression Blend.Ваша точка привязки была не в правильном месте (я не уверен, что вы меняете точки вращения для каждой анимации, но это предполагает, что вы качаете ее вперед и назад.

<Window x:Class="SimpleMove"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="OpenWWindow" Height="900" Width="900">
<Window.Resources>
    <Storyboard x:Key="AnimateRectangle">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" Storyboard.TargetName="rectangle">
            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="40"/>
            <EasingDoubleKeyFrame KeyTime="0:0:2" Value="-60"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</Window.Resources>
<Window.Triggers>
    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
        <BeginStoryboard Storyboard="{StaticResource AnimateRectangle}"/>
        <BeginStoryboard Storyboard="{StaticResource AnimateRectangle}"/>
    </EventTrigger>
</Window.Triggers>

...