2010-10-25 8 views
1

Je développe une application (VisualStudio 2010 Express pour Windows Phone). J'ai une listbox avec des images et un storyboard avec une animation (une projection) que je veux appliquer à un listboxitem/image spécifique lorsque l'événement SelectionChanged est déclenché (pas immédiatement mais dans le gestionnaire d'évènement). Comment puis-je "lier" mon animation à cet élément ListBox spécifique?wp7/Silverlight] Comment animer un ListBoxItem sur SelectionChanged?

Répondre

2

Eh bien, après essai et erreur, j'ai trouvé une solution, mais ce n'est pas exactement ce que je voulais (le storyboard défini en dehors du datatemplate et peut-être moins de code, je pense que c'est trop pour renverser une image) Fermer.

ainsi, l'exemple listbox:

<ListBox x:Name="lbxCardTable" SelectionChanged="lbxCardTable_SelectionChanged"> 

      <ListBox.ItemTemplate> 

       <DataTemplate> 

        <Grid x:Name="imgContainer"> 
         <Image x:Name="img" Source="{Binding } /> 
         <Grid.Resources> 
          <Storyboard x:Name="itemSb"> 
           <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetName="imgContainer" 
            Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)"> 
            <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="90"/> 
           </DoubleAnimationUsingKeyFrames> 
          </Storyboard> 
         </Grid.Resources> 
         <Grid.Projection> 
          <PlaneProjection/> 
         </Grid.Projection> 
        </Grid> 


       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

et le code derrière:

private void lbxCardTable_SelectionChanged(object sender, SelectionChangedEventArgs e) { 
object selectedItem = lbxCardTable.SelectedItem; 

      ListBoxItem lbitem = (ListBoxItem)lbxCardTable.ItemContainerGenerator.ContainerFromItem(selectedItem); 


      var border =(Border) VisualTreeHelper.GetChild(lbitem, 0); 

      var mcontentcontrol =(ContentControl) VisualTreeHelper.GetChild(border, 0); 

      var contentpresenter =(ContentPresenter) VisualTreeHelper.GetChild(mcontentcontrol, 0); 

      var mgrid=(Grid)VisualTreeHelper.GetChild(contentpresenter,0); 



      Storyboard sb = mgrid.Resources["itemSb"] as Storyboard; 
      if (sb.GetCurrentState() != ClockState.Stopped) { 
       sb.Stop(); 
      } 


      sb.Begin(); 
    } 
Questions connexes