Цветовая анимация раскадровки в WP8 вызывает исключение недопустимой операции

Я пытаюсь анимировать цвет фона стека на панели событий, чтобы выделить его. Стеклопанель находится внутри длинного списка. когда я нажимаю на конкретный элемент, я хочу выделить его код, как показано ниже

код XAML

**<phone:PhoneApplicationPage.Resources>
        <local:BooleanToForegroundConverter x:Key="BooleanToForegroundConverter"/>
<Style x:Key="MyLongListMultiSelectorItemListStyle" 
       TargetType="toolkit:LongListMultiSelectorItem">
            <Style.Setters>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="toolkit:LongListMultiSelectorItem">
                            <StackPanel 
                        Background="{Binding RelativeSource={RelativeSource TemplatedParent},  
                                             Path=IsSelected, Mode=TwoWay, 
                                             Converter={StaticResource BooleanToForegroundConverter}}">
</phone:PhoneApplicationPage.Resources>**
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style.Setters>
        </Style>
    <toolkit:LongListMultiSelector IsGroupingEnabled="True"
                                                  SelectionChanged="lstSongs_SelectionChanged"
                                                   GroupHeaderTemplate="{StaticResource BuddiesGroupHeaderTemplate}"
                                                   Background="Transparent"
                                                   JumpListStyle="{StaticResource AddrBookJumpListStyle}"
                                                   HideEmptyGroups="True"

                                                   x:Name="lstSongs"
                                                   toolkit:TiltEffect.IsTiltEnabled="True"        
                                                   ItemsSource="{Binding Songs}"
                               **ItemContainerStyle="{StaticResource MyLongListMultiSelectorItemListStyle}"**                     
                                                   IsSelectionEnabledChanged="lstSongs_IsSelectionEnabledChanged" 
                                                     >
                                <toolkit:LongListMultiSelector.ItemTemplate>
                            <DataTemplate >
                                <StackPanel   
                                    Margin="-40,0,0,17" 
                                    Width="432" 
                                    Height="78"
                                    Tap="OnTap"
                                   >
                                    <TextBlock 
                                        Text="{Binding Name}"  
                                        Margin="0,-15,0,0"
                                        Style="{StaticResource PhoneTextExtraLargeStyle}"
                                        Padding="0,0,0,0"/>
                                    <TextBlock  
                                        Text="{Binding Artist.Name}"   
                                        Margin="12,-6,12,0"

                                        Style="{StaticResource PhoneTextSubtleStyle}"/>
                                </StackPanel>
                            </DataTemplate>
                        </toolkit:LongListMultiSelector.ItemTemplate>
                            </toolkit:LongListMultiSelector>

И конвертер реализации

namespace musicplayer
{
    class BooleanToForegroundConverter:IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((bool)value) ? App.Current.Resources["PhoneAccentBrush"] as SolidColorBrush:new SolidColorBrush(Colors.Black);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new System.NotImplementedException();
        }
    }
}

**C# code ontap event**

    private void OnTap(object sender, System.Windows.Input.GestureEventArgs e)
            {
                //BackgroundAudioPlayer.Instance.Track = ((FrameworkElement)sender).DataContext as AudioTrack;
                //BackgroundAudioPlayer.Instance.Play();
                Storyboard storyBoard = new Storyboard();
                ColorAnimation animation = new ColorAnimation();

                animation.To = (System.Windows.Media.Color)App.Current.Resources["PhoneAccentColor"];
                animation.AutoReverse = true;
                animation.Duration = new Duration(TimeSpan.FromMilliseconds(1000));
                StackPanel sp = sender as StackPanel;
                Storyboard.SetTarget(animation, sp);
                PropertyPath colorTargetPath = new PropertyPath("(Panel.Background).(SolidColorBrush.Color)");
                Storyboard.SetTargetProperty(animation, colorTargetPath);
                storyBoard.Children.Add(animation);
               storyBoard.Begin();
        }

Но я получаю исключение недопустимой операции на storyBoard.Begin(); линия. Что мне не хватает?? Я только начал изучать Windows Phone 8, поэтому любая помощь очень ценится

1 ответ

Решение

Во-первых, не делайте этого в коде позади. Переопределите стиль LongListMultiSelectorItem и используйте конвертер для нужного элемента. Что-то вроде следующего

<Style x:Key="MyLongListMultiSelectorItemListStyle" 
       TargetType="toolkit:LongListMultiSelectorItem">
    <Style.Setters>                
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="toolkit:LongListMultiSelectorItem">
                    <StackPanel 
                        Background="{Binding RelativeSource={RelativeSource TemplatedParent},  
                                             Path=IsSelected, Mode=TwoWay, 
                                             Converter={StaticResource BooleanToForegroundConverter}}">                                
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style.Setters>
    </Style>

Я не публикую реализацию конвертера, это довольно просто. Верните желаемую кисть на основе логического значения.

Другие вопросы по тегам