WPF: обнаружение анимации или отмена временной шкалы. Завершенное событие? Как? - PullRequest
1 голос
/ 20 мая 2009

Я двигаю 3d камеру вот так:

    Point3DAnimation pa;

    // Triggered by user click
    void MoveCamera(object sender, EventArgs e)
    {

        pa = new Point3DAnimation(myPoint3D, TimeSpan.FromMilliseconds(2000));
        pa.Completed += new EventHandler(pa_Completed);
        Camera.BeginAnimation(PerspectiveCamera.PositionProperty, pa); // anim#1
    }

    // we're in place. do some idle animation
    void pa_Completed(object sender, EventArgs e)
    {
        pa = new Point3DAnimation(myPoint3Ddz, TimeSpan.FromMilliseconds(5000));
        Camera.BeginAnimation(PerspectiveCamera.PositionProperty, pa); // anim#2
    }
  1. Пользователь нажимает.
  2. Камера перемещается в выбранное положение (анимация № 1).
  3. Когда заканчивается анимация № 1, воспроизводится анимация № 2.

Все в порядке ... до тех пор, пока пользователь не запустит MoveCamera, когда предыдущая анимация # 1 не будет завершена.

В этом случае:

  1. Новый аним # 1 запускается.
  2. Завершено событие старого анима # 1.
  3. anim # 2 запускается мгновенно (с перекрытием нового anim # 1).

2 & 3 здесь не правы. Как я могу избежать этого?

Я думаю, что pa_Completed () должен обнаружить, что новый anim # 1 уже играет, или MoveCamera () должен отменить регистрацию события Complete из старого anim # 1. Но какой правильный способ сделать это?

1 Ответ

1 голос
/ 21 мая 2009

Если цель состоит в том, чтобы связать две анимации вместе, позвольте WPF выполнять тяжелую работу, используя класс Point3DAnimationUsingKeyFrames.

Во-первых, создайте анимацию ключевого кадра в XAML (в коде это непросто):

  <Window.Resources>
    <Point3DAnimationUsingKeyFrames x:Key="CameraMoveAnimation" Duration="0:0:7">
      <LinearPoint3DKeyFrame KeyTime="28%" />
      <LinearPoint3DKeyFrame KeyTime="100%" />
    </Point3DAnimationUsingKeyFrames>
  </Window.Resources>

Далее используйте его и установите фактические значения Point3D (используя ваши кодовые имена):

private void MoveCamera(object sender, EventArgs e) {
    Point3DAnimationUsingKeyFrames cameraAnimation = 
        (Point3DAnimationUsingKeyFrames)Resources["CameraMoveAnimation"];
    cameraAnimation.KeyFrames[0].Value = myPoint3D;
    cameraAnimation.KeyFrames[1].Value = myPoint3dz;
    Camera.BeginAnimation(PerspectiveCamera.PositionProperty, cameraAnimation);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...