2009-08-22 35 views
7

Me gustaría tener una animación cuando un elemento en ListView cambia de posición, por lo que se moverá lentamente a la nueva posición. Ya sea en una plantilla o en código. He intentado descender de un (StackPanel) de virtualización y anular ArrangeOverride para reposicionar y animar los elementos. el problema es que no sé en qué posición estaba el elemento antes de la actualización, así que pude hacer la transición a la nueva posición muy bien. Intenté comprobar la TranslateTransform del artículo, almacenarlo en un diccionario, anular OnItemChanged y almacenar OldPosition/Position ... pero nada funciona porque parece que los elementos siempre se vuelven a crear (a partir de la plantilla).(WPF) Animación ListView item move

¿Alguna otra sugerencia?

+0

Tal vez este artículo de Matthias Shapiro ayudaría: [Cómo Crear un ScrollViewer animado (o ListBox) en WPF] (http://www.designersilverlight.com/2009/05/06/how-to-create-an-animated-scrollviewer-or-listbox-in-wpf/) – Ray

Respuesta

7

comportamiento Uso FluidMoveBehavior, se le hará mucho más fácil la vida .

se puede aplicar esto a cualquier ItemsControl de la siguiente manera

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

puede encontrar este comportamiento en el Microsoft.Expression.Interactions.dll que se instala junto con Blend 3

+0

¿Tiene un enlace a la documentación de FluidMoveBehavior? Parece que no puedo encontrar nada. – Ray

+0

Se puede encontrar documentación de clase limitada en Expression Blend SDK UserGuide que se instala junto con Blend 3 – rravuri

+0

gracias por todas las respuestas. Este método con comportamientos se ve bien, pero el problema es que todos los elementos se vuelven a crear y todos están animados en posición (desde la parte superior). el mismo problema se aplica a todas las demás soluciones. Voy a considerar el uso de un DataGrid en su lugar, ya que parece tener algunas otras cosas que me gustaría. –

1

De hecho, este El problema fue solucionado por Dan Crevier en 2006. Vea su clase PanelLayoutAnimator.

+0

+1. Acabo de ver este artículo: se trata de una sola clase, el ejemplo de código fue fácil de entender, usarlo solo implica agregar un único atributo a su XAML y el resultado se ve bien. Recomendado. –

0

respuesta @rravuri funciona para mí, debe definir como un recurso dinámico se puede aplicar directamente y luego llamarlo DeEstaManera ItemsPanel = "{} DynamicResource ItemsPanelTemplate"