2 Stimmen

Fehler in der Storyboard-Animation?

Gestern habe ich keine Antwort erhalten, aber vielleicht habe ich das Problem nicht tief genug verstanden, um die richtige Frage zu formulieren.

Die Geschichte handelt von der Animation der ListBox-Höhe. Hier sind die folgenden Screenshots:

a) "Medium" ist ein TextBlock

Image1

b) "Medium" TextBlock wird durch eine ListBox ersetzt. Der Benutzer wählt ein Element aus. Das löst eine Animation der ListBox.Height aus. Nachdem die Animation abgeschlossen ist, wird die ListBox durch den ursprünglichen TextBlock ersetzt. (Ignorieren Sie die Unterschiede in den Daten. Das Sammeln der Bilder war ein mühsamer Prozess, als ich mit gerenderten Frames arbeiten musste. Eines der Bilder wurde für einen anderen Datensatz aufgenommen.)

Img2 Img3 Img4

Diese Sequenz funktioniert mit gelegentlichem Flackern. Ich wollte wissen, was da los ist, und nach einer Weile bekam ich diesen Screenshot:

Img5

Was Sie sehen, ist der erste Frame, nachdem das Ereignis Storyboard.Completed abgefangen wurde. Soweit ich weiß, ist dies das Endergebnis des Storyboards.

Anmerkungen:

  • Ich habe den visuellen Baum in diesem Moment überprüft und nichts Verdächtiges gefunden.

  • Dies ist nur eine der Auswirkungen, die auftreten. Ein weiterer häufiger Fall ist eine verkleinerte einzeilige Listbox mit blauer Schraffur; in diesem Fall verschwinden alle Elemente oberhalb der Listbox. Die dritte Möglichkeit ist eine diagonale rote Linie über den gesamten Bildschirm.

Hier ist der Code, der das Storyboard definiert:

    private Storyboard GetDropDownAnimation(double from, double to)
    {
        double secs = this.IsExpanded ? 0.2 : 0.4;
        CubicEase ease = new CubicEase() { EasingMode = EasingMode.EaseInOut };
        DoubleAnimation animation = new DoubleAnimation()
        {
            Duration = new Duration(TimeSpan.FromSeconds(secs)),
            From = from,
            To = to,
            FillBehavior = FillBehavior.HoldEnd,
            EasingFunction = ease
        };
        Debug.WriteLine("Animation Height {0} -> {1}", from, to);

        Storyboard.SetTarget(animation, this);
        Storyboard.SetTargetProperty(animation, new PropertyPath("Height"));

        Storyboard sb = new Storyboard();
        sb.Children.Add(animation);
        return sb;
    }

Ich könnte noch andere Tricks erklären (lange Zeit war ich davon überzeugt, dass das Problem dort liegt), aber es sieht so aus, als ob das Problem nur die Animation selbst betrifft.

Kann jemand erklären, was hier los ist?

2voto

Emond Punkte 48911

Schauen Sie sich diese an, bevor Sie weitermachen, das könnte Ihr Leben ein wenig einfacher machen :)

Sehen Sie sich also den Startwert der Animation (von) an und prüfen Sie, ob er korrekt ist.

Wenn alles andere fehlschlägt, können Sie mit einer vollständig transparenten Listbox beginnen.

0voto

Jan Slodicka Punkte 1495

Ich habe einige Fortschritte bei dem Problem gemacht, die es wert sein könnten, berichtet zu werden.

Zunächst habe ich Storyboard durch eigene Animationen ersetzt. Ich begann mit der Verwendung von CompositionTarget.Rendering Callbacks. Der Code ist ziemlich trivial: Im Callback muss man die Höhe der ListBox proportional zur verstrichenen Zeit aktualisieren. Ich habe überprüft, dass es für jede Höhenänderung ein LayoutUpdated-Ereignis gibt, mit anderen Worten, der Bildschirm ist immer synchron. (Eine angenehme Überraschung.)

Das Ergebnis: Das Flackern blieb.

Schlussfolgerung: Das Storyboard ist unschuldig.

Dann fand ich etwas Interessantes: Da ich die Höhenmanipulation selbst in der Hand hatte, rundete ich den Wert einfach auf das ganze Vielfache der Zeilenhöhe. Und siehe da - das Flackern verschwand!

Beachten Sie die ListBox in Frage wird mit ItemsSource und DisplayMemberPath, die auf eine String-Eigenschaft verweist eingerichtet. ItemTemplate ist nicht festgelegt. Mit anderen Worten ziemlich Standard ListBox verwenden.

Das ist keine Antwort, ich weiß, aber ich finde es interessant.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X