Остановите и запустите анимацию в WPF - PullRequest
0 голосов
/ 03 марта 2019

Я не могу заставить мою анимацию запускаться и останавливаться, с кодом позади (c #) Я попробовал MyStoryboard.stop () и изменил продолжительность анимации, и она останавливается, но только когда я изменяю содержимое и возвращаюсь назад.Когда я запускаю его снова, мои анимации запускаются со странными скоростями и снова, только если я меняю контент

, когда я меняю контент, появляется новая скорость, и если я продолжаю делать это, он выдает ошибки

Xaml:

<Image Grid.Row="0" MaxHeight="50" Source="..\Images\Propeller.png" 
   RenderTransformOrigin=".5,.5">
    <Image.RenderTransform>
         <RotateTransform x:Name="MyAnimation" Angle="0" />
    </Image.RenderTransform>
    <Image.Triggers>
        <EventTrigger RoutedEvent="Loaded">
             <BeginStoryboard>
                  <Storyboard x:Name="MyStoryboard">
                          <DoubleAnimation x:Name="Prope11" 
                            Storyboard.TargetName="MyAnimation"                     
                                 To="360" 
                                 Duration="0:0:0.6"
                                 RepeatBehavior="Forever"
                                 FillBehavior="Stop" />
                    </Storyboard>
              </BeginStoryboard>
         </EventTrigger>
     </Image.Triggers>
 </Image>

Код:

  TimeSpan ts = TimeSpan.FromMilliseconds(600);
  MyStoryboard.Stop();
  Prope11.Duration = ts;
  MyStoryboard.Bigin();

1 Ответ

0 голосов
/ 03 марта 2019

Вы не присвоили TargetName Свойство Раскадровки для запуска анимации.

Что ж, в вашем xaml есть две проблемы, чтобы запустить анимацию.

1) Storyboard.TargetName = "MyAnimation", имя цели должно быть именем элемента управления.В вашем случае вы предоставили, но вы дали или присвоили его RotateTransform, который находится под элементом управления Image, но не для изображения.

 <Image    x:Name="ImageControl" Grid.Row="0" MaxHeight="50" Source="C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"
   RenderTransformOrigin=".5,.5"   >

, а в DoubleAnimation укажите TargetName в качестве имени элемента управления Image

Storyboard.TargetName="ImageControl" 

2) Другая проблема заключается в том, что вы не предоставили свойство Target, от которого зависит ваша двойная анимация.

Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" 

Ваш код остановки не работал, поскольку, это не было начато.Добавление этого ниже xaml решит вашу проблему.

Изменение в скорости, потому что вы дали 600, в течение 6 секунд это должно быть 6000, а не 600.

Это изменение, которое я сделал,При событии Mouse Down я передал Stop StoryBoard.

     <Image.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard x:Name="BeginImageRotateAni" >
                <Storyboard x:Name="MyStoryboard">
                    <DoubleAnimation x:Name="Prope11" 
                    Storyboard.TargetName="ImageControl"         
                      Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" 
                         To="360" 
                         Duration="0:0:6"
                         RepeatBehavior="Forever"
                         FillBehavior="Stop"
                           >
                    </DoubleAnimation>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="MouseDown">
            <EventTrigger.Actions>
                <StopStoryboard BeginStoryboardName="BeginImageRotateAni"/>

            </EventTrigger.Actions>
        </EventTrigger>
    </Image.Triggers>

и подписался на MouseDownEvent в конструкторе

  ImageControl.MouseDown += ImageControl_MouseDown;

и написал код ниже в событии.

    bool IsAnimationstarted = true;

private void ImageControl_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (IsAnimationstarted)
    {
        MyStoryboard.Stop();
        IsAnimationstarted = false;
    }
    else
    {
        TimeSpan ts = TimeSpan.FromMilliseconds(6000);
        Prope11.Duration = ts;
        MyStoryboard.Begin();
        IsAnimationstarted = true;
    }
}
}

Альтернативное решение: - путем создания анимации в ресурсе и последующего использования ее в коде позади.

<Window.Resources>
    <Storyboard x:Name="MyStoryboard" x:Key="Animation1" >
        <DoubleAnimation x:Name="Prope11" 
                        Storyboard.TargetName="ImageControl"         
                          Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" 
                             To="360" 
                             Duration="0:0:6"
                             RepeatBehavior="Forever"
                             FillBehavior="Stop"
                               >
        </DoubleAnimation>
    </Storyboard>
</Window.Resources>

В коде позади: -

bool IsAnimationstarted = true;

private void ImageControl_MouseDown(object sender, MouseButtonEventArgs e)
{
    Storyboard board = (Storyboard)this.FindResource("Animation1");
    if (IsAnimationstarted)
    {
        IsAnimationstarted = false;
        board.Begin();
    }
    else
    {
        IsAnimationstarted = true;
        board.Pause();
    }
}

Я не знаю, почему меняют скорость или не уверены в своих намерениях.То, что я сделал здесь, это когда пользователь нажимает на элемент управления изображением, он запускает анимацию и снова нажимает паузу, и это продолжается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...