0

アニメーションを作成しようとしていますが、アニメーションが発生した後に一部のコードを実行する際に問題が発生します。アニメーションコードは次のとおりです...

public static void Friend(Canvas canvas)
{
    foreach (var element in canvas.Children.OfType<Image>())
    {
        var elementName = Regex.Split(element.Name, "_");
        if (elementName[0] == "friend")
        {
            var slideDown = new DoubleAnimation
                {
                    From = Canvas.GetBottom(element),
                    To = Canvas.GetBottom(element) - element.Height,
                    Duration = new Duration(TimeSpan.FromSeconds(1)),
                    AutoReverse = true
                };
            element.BeginAnimation(Canvas.BottomProperty, slideDown);
            slideDown.Completed += (sender, e) => Test(sender, e, element, canvas);
        }
    }
}

その後のイベントは…

var random = new Random();
element.Source = Core.StreamImage(Wardrobe.Friends[Wardrobe.RandomFriend()]);
Canvas.SetLeft(element, random.Next(0, (int)(canvas.ActualWidth - element.Width)));
// then reverse the previous animation.

ご覧のとおり、イベントが機能するためにはアニメーションのコンテキストを保持する必要がありますが、イベント ハンドラーはこれを許可していません。このコードを の直下に追加しようとしましたelement.BeginAnimationが、途中で実行されます。

また、アニメーションの部分を個別の関数に分割しようとしましたが、関数が順番に実行されず、最後のセクションのみが再生されるため、1 つのオブジェクトに複数のアニメーションを設定することはできません。

4

2 に答える 2

0

これが私が抱えていた問題を修正するために使用したコードです...

public static void Friend(Canvas canvas)
{
    var random = new Random();
    foreach (var element in canvas.Children.OfType<Image>())
    {
        var elementName = Regex.Split(element.Name, "_");
        if (elementName[0] == "friend")
        {
            var slideDown = new DoubleAnimation
            {
                From = Canvas.GetBottom(element),
                To = Canvas.GetBottom(element) - element.Height,
                Duration = new Duration(TimeSpan.FromSeconds(1))
            };
            slideDown.Completed += (sender, e) =>
            {
                element.Source = Core.StreamImage(Wardrobe.Friends[Wardrobe.RandomFriend()]);
                Canvas.SetLeft(element, random.Next(0, (int)(canvas.ActualWidth - element.Width)));
                var slideUp = new DoubleAnimation
                {
                    From = Canvas.GetBottom(element),
                    To = Canvas.GetBottom(element) + element.Height,
                    Duration = new Duration(TimeSpan.FromSeconds(1))
                };
                element.BeginAnimation(Canvas.BottomProperty, slideUp);
            };
            element.BeginAnimation(Canvas.BottomProperty, slideDown);
        }
    }
}
于 2012-11-28T03:44:12.960 に答える
0

イベントを実行の上に移動してみてください

public static void Friend(Canvas canvas)
{
    foreach (var element in canvas.Children.OfType<Image>())
    {
        var elementName = Regex.Split(element.Name, "_");
        if (elementName[0] == "friend")
        {
            var slideDown = new DoubleAnimation
                {
                    From = Canvas.GetBottom(element),
                    To = Canvas.GetBottom(element) - element.Height,
                    Duration = new Duration(TimeSpan.FromSeconds(1)),
                    AutoReverse = true
                };
            slideDown.Completed += (sender, e) => Test(sender, e, element, canvas);
            element.BeginAnimation(Canvas.BottomProperty, slideDown);
        }
    }
}

私は 100% ではありませんが、アニメーションは実行後に Freezable になると思うので、後で変更することはできません

ところで、オブジェクトに複数のアニメーションを設定できますが、「StoryBoard」を使用する必要があります。

ストーリーボードの例:

 var slideDown = new DoubleAnimation { From = 100, To = 200, Duration = new Duration(TimeSpan.FromSeconds(5)), AutoReverse = true };
 var slideLeft = new DoubleAnimation { From = 100, To = 200, BeginTime = TimeSpan.FromSeconds(5), Duration = new Duration(TimeSpan.FromSeconds(5)), AutoReverse = true };

 Storyboard storyBoard = new Storyboard();
 storyBoard.Children.Add(slideDown);
 storyBoard.Children.Add(slideLeft);
 Storyboard.SetTargetName(slideDown, myCanvas.Name);
 Storyboard.SetTargetName(slideLeft, myCanvas.Name);
 Storyboard.SetTargetProperty(slideLeft, new PropertyPath(Canvas.LeftProperty));
 Storyboard.SetTargetProperty(slideDown, new PropertyPath(Canvas.TopProperty));

 myCanvas.BeginStoryboard(storyBoard);
于 2012-11-28T03:32:13.373 に答える