Продолжительность ScalarKeyFrameAnimation стала короче - PullRequest
0 голосов
/ 12 октября 2019

enter image description here

Привет, я пытаюсь создать «ScalarKeyFrameAnimation» со следующим кодом, с первой попытки, когда я только включаю-выключаю один. Анимация запускается и останавливается как способ конфигурации объекта анимации 'вращения', но затем, при попытке несколько раз, я замечаю, что Visual вращается все медленнее и медленнее, затем останавливается. Как и в GIF

, я перенес создание анимации вращения на событие Page_Loaded. Чтобы его можно было создать только один раз. Но тогда ничего не изменится

    private Compositor compositor = Window.Current.Compositor;
    private Visual backvisual;        

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        backvisual = ElementCompositionPreview.GetElementVisual(FanIcon);

        backvisual.Size = new Vector2(100, 100);
        backvisual.CenterPoint = new Vector3(backvisual.Size / 2, 0);

        rotate = compositor.CreateScalarKeyFrameAnimation();
        rotate.InsertKeyFrame(1f, 360, compositor.CreateLinearEasingFunction());
        rotate.Duration = TimeSpan.FromMilliseconds(1000);
        rotate.IterationBehavior = AnimationIterationBehavior.Forever;

    }




    private void ToggleFanSec1_Toggled(object sender, RoutedEventArgs e)
    {
        if (ToggleFanSec1.IsOn == true)
        {
            backvisual.StartAnimation(nameof(Visual.RotationAngleInDegrees), rotate);
        }
        else
        {
            backvisual.StopAnimation(nameof(Visual.RotationAngleInDegrees));
        }
    }[![enter image description here][1]][1]

1 Ответ

1 голос
/ 14 октября 2019

Вы должны добавить ключевой кадр исходного состояния, его трудно найти без начального состояния и легко быть хаосом. Вы можете изменить код, как показано ниже. Это означает, что вращение с течением времени оживляет от 0 до 360.

rotate = compositor.CreateScalarKeyFrameAnimation();
rotate.InsertKeyFrame(0f, 0);
rotate.InsertKeyFrame(1f, 360, compositor.CreateLinearEasingFunction());
rotate.Duration = TimeSpan.FromMilliseconds(4000);
rotate.IterationBehavior = AnimationIterationBehavior.Forever;
...