2009-11-26 8 views
0

J'ai un Storyboard très simple avec un Int32Animation qui cible un DP personnalisé sur ma classe.WPF Storyboard ne met pas en pause

J'ai un callback OnChanged pour mon DP, qui fait un Console.WriteLine ("Current Value:" + MyDP). Quand je lance le storyboard, je peux voir la sortie de la console très bien, et quand je fais une pause sur le storyboard, la sortie de la console s'arrête, MAIS, quand je reprends le storyboard, le DP n'est pas la prochaine valeur à cela devrait être . Il continue d'augmenter même si le storyboard s'est arrêté.

Est-ce que quelqu'un a eu quelque chose comme cela leur est arrivé?

est ici un extrait de code de ce que Im faire

  Int32Animation element = new Int32Animation(); 
      element.From = 0; 
      element.To = targetTo; 
      element.Duration = dur; 
      Storyboard.SetTargetProperty(element, new PropertyPath(CurrentFrameProperty)); 
      _filmstripStoryboard = new Storyboard {SpeedRatio = this.FrameRate}; 
      _filmstripStoryboard.Children.Add(element); 


     public void Start() 
     { 
      _filmstripStoryboard.Begin(this, true); 
     } 

     public void Pause() 
     { 
      _filmstripStoryboard.Pause(this); 
     } 

     public void Unpause() 
     { 
      _filmstripStoryboard.Resume(this); 
     } 
+0

Y at-il un élément déclencheur dans le code XAML pour commencer le story-board? –

+0

non rien comme ça je ne pense pas – Mark

Répondre

1

Il y a un thread in the MSDN forums où Microsoft confirme que ce comportement (la valeur actuelle continue même si pendant un certain temps le story-board est en pause) est un bogue dans l'ancien -current (à partir de 2006) version de WPF. Le fil de discussion du forum inclut une solution de contournement suggérée, en particulier, enregistrer la position actuelle lorsque vous faites une pause et revenir manuellement à la même position lorsque vous reprenez.

Le thread mentionne qu'ils pensaient à corriger le bogue dans une prochaine version, mais je ne sais pas si .NET 3.5 ou 4.0 a effectivement corrigé ce bogue ou non.

EDIT: Il semble que le bogue est corrigé dans .NET 4.0 - j'ai été capable de mettre en pause puis de reprendre une animation sans qu'elle saute vers l'avant sur l'intervalle de temps. (Je n'ai pas testé en 3.5.)

0

Maintenant il n'y a pas de bug dans 4.0. Le code ci-dessous fonctionne bien.

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="WpfAnimation.Win1805787" 
    xmlns:Local="clr-namespace:WpfAnimation" 
    x:Name="MyWindow" 
    Title="Win1805787" 
    Width="640" Height="480"> 

    <Grid x:Name="LayoutRoot">  

     <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> 
      <TextBox HorizontalAlignment="Right" VerticalAlignment="Top" Width="75" Text="{Binding CurrentFrame, ElementName=MyWindow}" Height="20" Margin="5,0,5,5"/> 
      <Button x:Name="Play1" Content="Play" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Play_Click" Margin="5,0,5,5"/> 
      <Button x:Name="Pause1" Content="Pause" HorizontalAlignment="Right" VerticalAlignment="Top" Width="75" Click="Pause_Click" Margin="5,0,5,5"/> 
      <Button x:Name="Resume1" Content="Resume" HorizontalAlignment="Right" VerticalAlignment="Top" Width="75" Click="Resume_Click" Margin="5,0,5,5"/> 
     </StackPanel> 

     </Grid> 

</Window> 

/////////////////////////

using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Data; 
    using System.Windows.Documents; 
    using System.Windows.Input; 
    using System.Windows.Media; 
    using System.Windows.Media.Imaging; 
    using System.Windows.Shapes; 
    using System.Windows.Media.Animation; 

    namespace WpfAnimation 
    { 
     /// <summary> 
     /// Interaction logic for Win1805787.xaml 
     /// </summary> 
     public partial class Win1805787 : Window 
     { 
      public Win1805787() 
      { 
       this.InitializeComponent(); 

       _createStoryBoard(); 
       // Insert code required on object creation below this point. 
      } 

      public int CurrentFrame 
      { 
       get { return (int)GetValue(CurrentFrameProperty); } 
       set { SetValue(CurrentFrameProperty, value); } 
      } 

      // Using a DependencyProperty as the backing store for CurrentFrame. This enables animation, styling, binding, etc... 
      public static readonly DependencyProperty CurrentFrameProperty = 
       DependencyProperty.Register("CurrentFrame", typeof(int), typeof(Win1805787), 
         new PropertyMetadata(0, new PropertyChangedCallback(OnValueChanged))); 

      private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
      { 

      } 

      Storyboard _filmstripStoryboard; 

      void _createStoryBoard() 
      {  
       Int32Animation element = new Int32Animation(); 
       element.From = 0; 
       element.To = 100; 
       element.Duration = Duration.Plus(new Duration(new TimeSpan(1000000000))); 
       Storyboard.SetTargetProperty(element, new PropertyPath(CurrentFrameProperty)); 
       _filmstripStoryboard = new Storyboard { SpeedRatio = 0.5 }; 
       _filmstripStoryboard.Children.Add(element); 
      } 

      private void Play_Click(object sender, System.Windows.RoutedEventArgs e) 
      { 
       _filmstripStoryboard.Begin(this, true); 
      } 

      private void Pause_Click(object sender, System.Windows.RoutedEventArgs e) 
      { 
       _filmstripStoryboard.Pause(this); 
      } 

      private void Resume_Click(object sender, System.Windows.RoutedEventArgs e) 
      { 
       _filmstripStoryboard.Resume(this); 
      } 

     } 
    }