2017-03-09 2 views
0

Je rencontre un problème lors de l'utilisation d'une animation pour afficher la traduction d'une ligne dans une grille de données groupée d'un groupe à un autre. L'animation se produit, mais la ligne se déplace derrière autres lignes sur son chemin vers la nouvelle position. Le regroupement est effectué en fonction du contenu de l'une des cellules. Ainsi, lorsqu'un utilisateur modifie le contenu, la ligne est déplacée vers le nouveau groupe. Voici quelques XAML qui montre la grille:Animer déplacer un datagridrow

<DataGrid x:Name="dataGrid" AutoGenerateColumns="False" CanUserAddRows="False"> 
    <DataGrid.GroupStyle> 
    <GroupStyle> 
     <GroupStyle.ContainerStyle> 
     <Style TargetType="{x:Type GroupItem}"> 
      <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type GroupItem}"> 
       <StackPanel> 
        <TextBlock Text="{Binding Name}"/> 
        <ItemsPresenter /> 
       </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
      </Setter> 
     </Style> 
     </GroupStyle.ContainerStyle> 
    </GroupStyle> 
    </DataGrid.GroupStyle> 
    <DataGrid.Columns> 
    <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}"/> 
    <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"/> 
    <DataGridTextColumn Header="Email" Binding="{Binding Email}"/> 
    <DataGridTemplateColumn Header="Country"> 
     <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Country}"/> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
     <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Country, UpdateSourceTrigger=PropertyChanged}" TextChanged="TextBoxBase_OnTextChanged"/> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellEditingTemplate> 
    </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Pour afficher l'animation, je le tir hors tension dans le gestionnaire d'événements TextChanged. Le code localise là, le DataGridRow et un point cible dans le nouveau groupe, et appelle une méthode pour faire l'animation:

private void Animate(FrameworkElement element, Point target) 
{ 
    if (element != null) 
    { 
    Point sourcePoint = element.PointToScreen(new Point(0, 0)); 
    double yOffset = target.Y - sourcePoint.Y; 

    element.SetValue(Panel.ZIndexProperty, 10); // this doesn't help 
    TranslateTransform translateTransform = new TranslateTransform(); 
    element.RenderTransform = translateTransform; 

    Duration duration = new Duration(TimeSpan.FromSeconds(3)); 
    DoubleAnimation anim = new DoubleAnimation(0, yOffset, duration); 
    translateTransform.BeginAnimation(TranslateTransform.YProperty, anim); 
    } 
} 

Cela fonctionne, mais une ligne se déplaçant vers le bas à un autre groupe s'affiche va derrière l'autre des rangées; c'est-à-dire que la rangée mobile est en dessous et cachée par les autres rangées le long du chemin. Définir ZIndex sur le DataGridRow ne semble rien faire. Notez également que le déplacement d'une ligne fonctionne correctement - la ligne en mouvement est affichée sur les autres lignes. J'ai également essayé de déclencher l'animation à partir d'événements autres que TextChanged (ce que je pense devoir éventuellement faire) mais je n'en ai trouvé aucun qui semble important.

Merci.

Répondre

0

J'ai trouvé une réponse à ma question. L'indice dont j'avais besoin provenait de ce Silverlight post. En particulier, la ligne "Tous les éléments de la liste doivent être frères et sœurs si vous souhaitez les mettre en couches." Ce qui se passait pour moi était que, à cause du regroupement, les rangées n'étaient pas les frères et soeurs l'un de l'autre - ils n'étaient pas les enfants directs d'un parent commun. Au lieu de cela, c'était le GroupItem s contenant les lignes qui étaient les frères et sœurs. Il me fallait donc ajouter à mon Animate() méthode le code:

GroupItem groupItem = TryFindParent<GroupItem>(element); 
    groupItem.SetValue(Panel.ZIndexProperty, 10); 

où l'élément est le DataGridRow à déplacer.

Je dois encore trouver un meilleur déclencheur pour l'animation, mais au moins la ligne se déplace devant les autres lignes le long du chemin.