1

クラスのカスタム DP をターゲットとする Int32Animation を持つ非常に単純なストーリーボードがあります。

Console.WriteLine("Current Value: " + MyDP) を実行する DP の OnChanged コールバックがあります。

ストーリーボードを実行すると、コンソールの出力が正常に表示されます。ストーリーボードを一時停止すると、コンソールの出力が停止しますが、ストーリーボードを再開すると、DP は次の値ではありません。絵コンテが止まっているのに増え続けています。

このようなことが起こった人はいますか?

ここに私がやっていることのコードスニペットがあります

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

2 に答える 2

1

MSDNフォーラムにスレッドがあり、Microsoftは、この動作(ストーリーボードがしばらく一時停止している場合でも現在の値が続く)が、当時の(2006年現在の)WPFリリースのバグであることを確認しています。フォーラムスレッドには、推奨される回避策が含まれています。具体的には、一時停止するときに現在の位置を保存し、再開するときに手動で同じ位置に戻ります。

スレッドは、彼らが将来のバージョンでバグを修正することを考えていたと述べていますが、.NET3.5または4.0が実際にこのバグを修正したかどうかはわかりません。

編集:バグは.NET 4.0で修正されているようです-アニメーションを一時停止してから再開することができましたが、その間にジャンプすることはありませんでした。(3.5ではテストしませんでした。)

于 2011-03-15T00:04:20.423 に答える
0

現在、4.0 にはバグはありません。以下のコードは正常に動作します。

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

        }
    }
于 2015-09-10T19:26:56.680 に答える