2009-08-22 14 views
7

Mi piacerebbe avere un'animazione quando una voce in ListView cambia posizione, quindi passerebbe lentamente alla nuova posizione. In un modello o nel codice. Ho provato a scendere da uno (Virtualizing) StackPanel e a sovrascrivere ArrangeOverride per riposizionare e animare gli elementi. il problema è che non so in quale posizione l'oggetto era "prima" dell'aggiornamento, quindi ho potuto passare alla nuova posizione in modo appropriato. Ho provato a verificare TranslateTransform dell'elemento, archiviare in un dizionario, ignorare OnItemChanged e memorizzare OldPosition/Position .. ma nessuno di questi funziona perché sembra che gli elementi vengano sempre ricreati (dal modello).(WPF) Animate ListView item move

Altri suggerimenti?

+0

Forse questo articolo da Matthias Shapiro avrebbe aiutato: [How To Creare un ScrollViewer animato (o ListBox) in WPF] (http://www.designersilverlight.com/2009/05/06/how-to-create-an-animated-scrollviewer-or-listbox-in-wpf/) – Ray

risposta

7

comportamento Usa FluidMoveBehavior, che vi farà molto la vita più facile .

è possibile applicare questo a qualsiasi ItemsControl nel modo seguente

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

è possibile trovare questo comportamento nel Microsoft.Expression.Interactions.dll che viene installato insieme a Blend 3

+0

Hai un link alla documentazione di FluidMoveBehavior? Non riesco a trovare nulla. – Ray

+0

La documentazione di classe limitata può essere trovata nell'uschuide di Expression Blend SDK che è installato insieme a Blend 3 – rravuri

+0

, grazie per tutte le risposte .. questo metodo con i comportamenti sembra buono, ma il problema è che tutti gli elementi sono ricreati e quindi tutti animati in posizione (dall'alto). lo stesso problema si applica a tutte le altre soluzioni. Cercherò di utilizzare un DataGrid invece come sembra avere alcune altre cose che mi piacerebbe. –

1

In realtà questo Il problema è stato risolto alla perfezione da Dan Crevier nel 2006. Dai un'occhiata alla sua classe PanelLayoutAnimator.

+0

+1. Ho appena controllato questo articolo - riguarda una singola classe, l'esempio del codice era facile da capire, usarlo comporta solo l'aggiunta di un singolo attributo al tuo XAML e il risultato sembra buono. Consigliato. –

0

risposta @rravuri funziona per me, è necessario definire come una risorsa dinamica è possibile applicare direttamente e poi chiamarlo ComeQuesta ItemsPanel = "{} DynamicResource ItemsPanelTemplate"