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 p> Il peut être simplement testé dans une fenêtre WPF comme ceci: p>
3 Réponses :
ressemble à une faute de frappe. Très probablement, c'est parce que votre xanimation code> anime (code> window.top code> et
yanimation code> animees
fenêtre.left code>:
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 code> terminé >, changeant sur doubleinimation code>. Même écrit les mêmes animations dans XAML avec des valeurs fixes
à code> 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.
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))); }
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();
}