2014-07-22 1 views
0

J'essaye d'animer la couleur de fond de la pile en tapant l'événement pour la mettre en surbrillance. Stackpanel est à l'intérieur de longlistselector. quand je tape sur l'élément particulier que je veux mettre en évidence le code est comme ci-dessousAnimation de la couleur du storyboard WP8 lançant une exception d'opération invalide

code 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> 

et la mise en œuvre Convertisseur

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(); 
     } 

Mais je suis en train de l'opération non valide exception sur storyBoard.Begin(); ligne. Qu'est-ce qui me manque ?? Je viens de commencer à apprendre Windows Phone 8 donc toute aide est très appréciée

Répondre

0

Tout d'abord, ne le faites pas dans le code-behind. Remplacez le style LongListMultiSelectorItem et utilisez un convertisseur pour l'élément souhaité. Quelque chose comme le suivant

<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> 

Je ne poste pas l'implémentation du convertisseur, c'est assez simple. Renvoie le pinceau souhaité en fonction de la valeur booléenne.

+0

Je suis nouveau au développement de Windows Phone. Pouvez-vous m'expliquer ce qui se passe dans ce code-> Background = "{Relative RelativeSource = {RelativeSource TemplatedParent}, Chemin = IsSelected, Mode = TwoWay, Converter = {StaticResource BooleanToForegroundConverter}}" et je veux que cette animation se produise onLap de stackpanel – Archana

+0

LongListMultiSelectorItem possède une propriété de dépendance IsSelected booléenne qui est mise à jour chaque fois que vous sélectionnez/désélectionnez un élément. Essentiellement en appuyant sur un élément de votre LongListMultiSelector tweks cette propriété. Cette ligne de XAML lie l'arrière-plan de votre pile à cette propriété et utilise un convertisseur pour renvoyer un pinceau souhaité. – Pantelis

+0

J'essaie d'utiliser ce que vous avez suggéré. Mais maintenant, je reçois l'exception \t {System.Windows.Markup.XamlParseException: Impossible de créer une instance de type 'musicplayer.BooleanToForegroundConverter'. J'ai édité le code que j'ai modifié – Archana

Questions connexes