2009-08-22 16 views
7

Ich möchte eine Animation haben, wenn ein Element in ListView Position ändert, so dass es langsam an die neue Position verschieben würde. Entweder in einer Vorlage oder in Code. Ich habe versucht, von einem (virtualisierten) StackPanel abzusteigen und ArrangeOverride zu überschreiben, um die Elemente neu zu positionieren und zu animieren. Das Problem ist, dass ich nicht weiß, an welcher Position der Artikel "vor" dem Update war, so dass ich gut in die neue Position wechseln konnte. Ich habe versucht, die TranslateTransform des Elements zu überprüfen, in einem Wörterbuch zu speichern, OnItemChanged zu überschreiben und OldPosition/Position zu speichern, aber nichts davon funktioniert, weil es scheint, dass die Elemente immer neu erstellt werden (aus der Vorlage).(WPF) Animate ListView Element verschieben

Haben Sie noch weitere Vorschläge?

+0

Vielleicht würde helfen, dieser Artikel von Matthias Shapiro: [How To Erstellen Sie einen animierten ScrollViewer (oder ListBox) in WPF] (http://www.designersilverlight.com/2009/05/06/how-to-create-ananimated-scrollviewer-orlistbox-in-wpf/) – Ray

Antwort

7

Verwenden FluidMoveBehavior Verhalten, wird es Ihnen das Leben viel einfacher machen .

können Sie dies auf jedes Item auf folgende Weise anwenden

<ItemsPanelTemplate x:Key="ItemsPanelTemplate"> 
      <WrapPanel> 
       <i:Interaction.Behaviors> 
        <il:FluidMoveBehavior AppliesTo="Children" Duration="00:00:00.75"/> 
       </i:Interaction.Behaviors> 
      </WrapPanel> 
</ItemsPanelTemplate> 

Sie dieses Verhalten in der Microsoft.Expression.Interactions.dll finden kann, die diese zusammen mit Blend 3

+0

Haben Sie einen Link zur Dokumentation von FluidMoveBehavior? Ich kann nichts finden. – Ray

+0

Begrenzte Klassendokumentation finden Sie im User Guide des Expression Blend SDK, der zusammen mit Blend 3 – rravuri

+0

für alle Antworten installiert wird. Diese Methode mit Verhalten sieht gut aus, aber das Problem ist, dass alle Elemente neu erstellt werden und alle animiert sind in Position (von oben). Das gleiche Problem gilt für alle anderen Lösungen. Ich werde stattdessen ein DataGrid verwenden, da es ein paar andere Dinge zu haben scheint. –

1

In der Tat installiert ist Problem wurde von Dan Crevier im Jahr 2006 perfekt gelöst. Überprüfen Sie seine PanelLayoutAnimator Klasse.

+0

+1 anfügen. Ich habe gerade diesen Artikel überprüft - es handelt sich um eine einzelne Klasse, das Codebeispiel war einfach zu verstehen, es verwendet nur ein einzelnes Attribut zu Ihrem XAML hinzufügen und das Ergebnis sieht gut aus. Empfohlen. –

0

@rravuri Antwort funktioniert für mich, Sie als dynamisches Ressource definieren müssen Sie direkt anwenden können, und nennen es dann Diesembeispiel Itemspanel = „{} Dynamicitemspaneltemplate“