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
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.)
Diese Sequenz funktioniert mit gelegentlichem Flackern. Ich wollte wissen, was da los ist, und nach einer Weile bekam ich diesen Screenshot:
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?