6
votes

Pourquoi mon WPF traduit-il l'arrêt d'animation avant de terminer?

J'ai écrit une fenêtre qui devrait fournir une animation de traduction simple à une fenêtre. Mais cette animation s'arrête toujours avant de pouvoir atteindre les coordonnées cibles. Quelqu'un peut-il me donner un conseil pourquoi?

meilleures salutations chris xxx

Il peut être simplement testé dans une fenêtre WPF comme ceci: xxx


0 commentaires

3 Réponses :


1
votes

ressemble à une faute de frappe. Très probablement, c'est parce que votre xanimation anime (code> window.top et yanimation animees fenêtre.left : xxx < / pré>


3 commentaires

Oh! C'est vrai, c'est une faute de frappe ... J'ai corrigé mon erreur, mais je vais avoir le même résultat :(


Hmmmm, très étrange et c'est incompatible dans mon cas. J'ai essayé d'éliminer l'événement terminé , changeant sur doubleinimation . Même écrit les mêmes animations dans XAML avec des valeurs fixes à et parfois il atteint le point de destination et parfois ce n'est pas le cas.


Tout d'abord Big ThX pour tester le problème. J'ai également essayé d'appeler la méthode de traduction récursivement dans le complévententhandler. (Bien sûr, à des fins de test uniquement), j'ai trouvé quelque chose de drôle (étrange). J'ai ajouté une vérification de l'égalité des coordonnées cible et de la valeur restante gauche et supérieure de la fenêtre. Ils étaient égaux, mais la fenêtre n'était pas située à cette position.



-1
votes

J'ai trouvé quelque chose qui fonctionne pour mes besoins, mais c'est très sale et j'aimerais changer la mise en œuvre avec quelque chose de gentil. Donc, si quelqu'un sait pourquoi ... veuillez dire :)

  public static void Translate(this Window element, double x, double y, TimeSpan duration)
  {
     var xAnimation = new DoubleAnimationUsingKeyFrames { Duration = duration };
     xAnimation.KeyFrames.Add(new LinearDoubleKeyFrame(element.Left, KeyTime.FromPercent(0.0)));
     xAnimation.KeyFrames.Add(new LinearDoubleKeyFrame(x, KeyTime.FromPercent(1.0)));

     var yAnimation = new DoubleAnimationUsingKeyFrames { Duration = duration };
     yAnimation.KeyFrames.Add(new LinearDoubleKeyFrame(element.Top, KeyTime.FromPercent(0.0)));
     yAnimation.KeyFrames.Add(new LinearDoubleKeyFrame(y, KeyTime.FromPercent(1.0)));

     Storyboard.SetTargetProperty(xAnimation, new PropertyPath("(Window.Left)"));
     Storyboard.SetTargetProperty(yAnimation, new PropertyPath("(Window.Top)"));

     var storyboard = new Storyboard
     {
        Children = { yAnimation, xAnimation },
        Duration = duration,
        FillBehavior = FillBehavior.Stop,
     };

     storyboard.Completed += (sender, args) =>
     {
        storyboard.SkipToFill();
        storyboard.Remove(element);

        element.InvalidateProperty(Window.LeftProperty);
        element.InvalidateProperty(Window.TopProperty);

        if (Math.Abs(element.Left - x) > Double.Epsilon || Math.Abs(element.Top - y) > Double.Epsilon)
           Translate(element, x, y, TimeSpan.FromTicks(Math.Min(duration.Ticks / 2, 100)));
     };

     element.Dispatcher.Invoke(DispatcherPriority.ApplicationIdle, new Action(() => element.BeginStoryboard(storyboard)));
  }


0 commentaires

4
votes

Positionnement de la fenêtre WPF / ré-dimensionnement avec la DPI Scaleting indépendant a toujours été un problème pour moi (en particulier lorsque vous souhaitez animer les changements de mouvement / taille en douceur dans le respect des configurations DPI et multi-surveillants)

J'ai écrit Une classe d'assistance personnalisée pour aider à animer les dimensions de la fenêtre qui pourrait également vous aider également. p>

La classe principale ( natifwindowsizemanager code>): p>

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) {
  var storyBoard = new Storyboard { Duration = new Duration(new TimeSpan(0, 0, 0, 0, 250)) };

  // Top
  var aniTop = new DoubleAnimationUsingKeyFrames { Duration = new Duration(new TimeSpan(0, 0, 0, 0, 250)) };
  aniTop.KeyFrames.Add(new EasingDoubleKeyFrame(Top, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0, 0, 00))));
  aniTop.KeyFrames.Add(new EasingDoubleKeyFrame(10, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0, 0, 250))));
  Storyboard.SetTarget(aniTop, this);
  Storyboard.SetTargetProperty(aniTop, new PropertyPath(NativeWindowSizeManager.NativeWindowTopProperty));
  storyBoard.Children.Add(aniTop);

  // Left
  var aniLeft = new DoubleAnimationUsingKeyFrames { Duration = new Duration(new TimeSpan(0, 0, 0, 0, 250)) };
  aniLeft.KeyFrames.Add(new EasingDoubleKeyFrame(Left, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0, 0, 00))));
  aniLeft.KeyFrames.Add(new EasingDoubleKeyFrame(10, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0, 0, 250))));
  Storyboard.SetTarget(aniLeft, this);
  Storyboard.SetTargetProperty(aniLeft, new PropertyPath(NativeWindowSizeManager.NativeWindowLeftProperty));
  storyBoard.Children.Add(aniLeft);
  storyBoard.Begin();
}


0 commentaires