Frage

Ich habe eine sehr einfache Storyboard mit einem Int32Animation, die einen benutzerdefinierten DP auf meiner Klasse als Ziel hat.

Ich habe einen OnChanged Rückruf für meine DP, die eine Console.WriteLine tut ( "Aktuellen Wert:" + MYDP)

.

Als ich das Drehbuch laufe, kann ich die Ausgabe auf Konsole einfach gut sehen, und wenn ich die Storyboard Pause, die Konsolenausgabe stoppt, ABER, wenn ich das Drehbuch wieder aufnehmen, die DP ist nicht der nächste Wert es sein sollte. Weiter geht es zu erhöhen, obwohl das Storyboard zum Stillstand gekommen ist.

Hat jemand hatte so etwas mit ihnen geschehen?

Hier ist ein Code-Snippet, was Im tun

            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);
        }
War es hilfreich?

Lösung

Es gibt eine Thread in der MSDN Foren wo Microsoft dieses Verhalten (der aktuelle Wert, selbst wenn das Storyboard weiterhin für eine Weile pausiert) bestätigt, dass ein Fehler in dem dann aktuellen ist (Stand: 2006) Version von WPF. Das Forum-Thread umfasst eine vorgeschlagene Abhilfe, und zwar die aktuelle Position speichern aus, wenn Sie anhalten und manuell zu der gleichen Position suchen zurück, wenn Sie wieder auf.

Der Thread erwähnt, dass sie über die Festsetzung der Fehler in einer zukünftigen Version dachten, aber ich weiß nicht, ob tatsächlich .NET 3.5 oder 4.0 dieser Fehler behoben ist oder nicht.

EDIT: Es scheint, dass der Bug 4.0 .NET in festgelegt ist - ich war in der Lage zu pausieren und dann eine Animation wieder aufnehmen, ohne sie nach vorne über die dazwischen liegenden Zeit zu springen. (Ich habe nicht in 3.5 testen.)

Andere Tipps

Jetzt gibt es keine Fehler in 4.0. Im Folgenden Code funktioniert gut.

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

        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top