簡體   English   中英

每次按下“ WPF Animmation”按鈕,我如何重播相同的動畫

[英]How can i replay the same animation every time button pressed “ WPF Animmation”

每次按一次btn動畫播放時,我如何重播相同的動畫,但是nxt出現運行時錯誤

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        int j = 0;
        string[] names ={"/Assets/1.png", "/Assets/2.png", "/Assets/3.png", "/Assets/4.png", "/Assets/5.png" };

        var storyboard = new Storyboard
        {


        };

        var animation = new ObjectAnimationUsingKeyFrames();

        Storyboard.SetTarget(animation,img);
        Storyboard.SetTargetProperty(animation, new PropertyPath("Source"));

        storyboard.Children.Add(animation);

        for (int i=0 ; i <=4; i++)
        {
           // j = j + 1;
            var keyframe = new DiscreteObjectKeyFrame
            {
                KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(300* i)),


               Value = String.Format(names[i])

            };

            animation.KeyFrames.Add(keyframe);

        }

            Resources.Add("Storyboard", storyboard);
            // Resources.Add("Storyboard", storyboard);

            storyboard.Begin();
           // storyboard.Completed += new EventHandler(Story_Completed);


           // Thread.Sleep(1000);
            if (j==4)
            {
                storyboard.Pause();

        }

        }

由於您沒有提供有關異常的詳細信息,因此很難判斷錯誤的出處,但我看到至少一件事可能無法解決:

Resources.Add("Storyboard", storyboard);

這將在第一次工作,但第二次將引發異常(因為情節提要已添加到資源中)。

在任何情況下,如果采取一些預防措施,都可以重復使用同一情節提要對象:

首先,讓我們將情節提要存儲在一個屬性中,因為它比資源更易於操作:

private Storyboard ButtonStoryboard { get; set; }

單擊按鈕時,我們首先檢查情節提要是否存在。 如果沒有,我們創建它:

if (this.ButtonStoryboard == null)
{
    string[] names ={"/Assets/1.png", "/Assets/2.png", "/Assets/3.png", "/Assets/4.png", "/Assets/5.png" };

    var storyboard = new Storyboard();
    var animation = new ObjectAnimationUsingKeyFrames();

    Storyboard.SetTarget(animation,img);
    Storyboard.SetTargetProperty(animation, new PropertyPath("Source"));

    storyboard.Children.Add(animation);

    for (int i=0 ; i <=4; i++)
    {
        var keyframe = new DiscreteObjectKeyFrame
        {
            KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(300* i)),
           Value = String.Format(names[i])
        };

        animation.KeyFrames.Add(keyframe);
    }

    this.ButtonStoryboard = storyboard;
}

現在,只有在尚未運行情節提要的情況下,我們才必須啟動情節提要(您不能兩次啟動)。 如果它已經在運行,我們將其停止並倒帶(就像錄像帶一樣):

if (this.ButtonStoryboard.GetCurrentState() != ClockState.Stopped)
{
    this.ButtonStoryboard.Stop();
    this.ButtonStoryboard.Seek(TimeSpan.Zero);
}

this.ButtonStoryboard.Begin();

放在一起:

private Storyboard ButtonStoryboard { get; set; }

private void Button_Click(object sender, RoutedEventArgs e)
{
    if (this.ButtonStoryboard == null)
    {
        string[] names ={"/Assets/1.png", "/Assets/2.png", "/Assets/3.png", "/Assets/4.png", "/Assets/5.png" };

        var storyboard = new Storyboard();
        var animation = new ObjectAnimationUsingKeyFrames();

        Storyboard.SetTarget(animation,img);
        Storyboard.SetTargetProperty(animation, new PropertyPath("Source"));

        storyboard.Children.Add(animation);

        for (int i=0 ; i <=4; i++)
        {
            var keyframe = new DiscreteObjectKeyFrame
            {
                KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(300* i)),
               Value = String.Format(names[i])
            };

            animation.KeyFrames.Add(keyframe);
        }

        this.ButtonStoryboard = storyboard;
    }

    if (this.ButtonStoryboard.GetCurrentState() != ClockState.Stopped)
    {
        this.ButtonStoryboard.Stop();
        this.ButtonStoryboard.Seek(TimeSpan.Zero);
    }

    this.ButtonStoryboard.Begin();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM