Domanda

Ho uno Storyboard molto semplice con un Int32Animation che ha come target un DP personalizzato sulla mia classe.

Ho un callback OnChanged per il mio DP, che esegue Console.WriteLine (" Current Value: " + MyDP).

Quando eseguo lo storyboard, riesco a vedere bene l'output della console, e quando metto in pausa lo storyboard, l'output della console si interrompe, MA quando riprendo lo storyboard, DP non è il valore successivo. Continua ad aumentare anche se lo storyboard si è fermato.

Qualcuno ha fatto accadere qualcosa del genere a loro?

ecco uno snippet di codice di ciò che sto facendo

            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);
        }
È stato utile?

Soluzione

Esiste un thread in MSDN forum in cui Microsoft conferma che questo comportamento (il valore attuale continua anche quando lo storyboard è in pausa per un po ') è un bug nell'attuale versione (a partire dal 2006) di WPF. Il thread del forum include una soluzione alternativa, in particolare, salva la posizione corrente quando ti fermi e cerca manualmente nella stessa posizione quando riprendi.

Il thread menziona che stavano pensando di correggere il bug in una versione futura, ma non so se .NET 3.5 o 4.0 abbia effettivamente corretto questo bug o meno.

MODIFICA: Sembra che il bug sia stato corretto in .NET 4.0 - Sono stato in grado di mettere in pausa e quindi riprendere un'animazione senza che saltasse in avanti nel tempo intermedio. (Non ho testato in 3.5.)

Altri suggerimenti

Ora non c'è nessun bug in 4.0. Il codice seguente funziona bene.

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

        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top