wp7 / Silverlight] Как анимировать ListBoxItem на SelectionChanged?
Я занимаюсь разработкой приложения (VisualStudio 2010 Express для Windows Phone). У меня есть список с изображениями и раскадровка с анимацией (проекция), которую я хочу применить к определенному элементу списка / изображению, когда происходит событие SelectionChanged (ну, не сразу, а внутри обработчика событий).
Как я могу "связать" мою анимацию с этим конкретным ListBoxItem?
1 ответ
Решение
Ну, после проб и ошибок я нашел решение, но это не совсем то, что я хотел (раскадровка определена за пределами таблицы данных и, возможно, меньше кода. Я думаю, что это слишком много, чтобы просто перевернуть изображение), но очень близко.
Итак, пример списка:
<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>
И Код позади:
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();
}