c# - الرسوم المتحركة ستوريبوارد متخلفة



animation storyboard (0)

أنا خلقت تساقط الثلوج الرسوم المتحركة ولكن قليلا متخلفة، إذا أنا إنشاء هذه الرسوم المتحركة في التطبيق الجديد فارغة يعمل بشكل جيد ولكن إذا حاولت بناء بعض المزيد من الأشياء واستخدامه بشكل كامل بناء التطبيق يبدأ يتخلف.

XAML

<Grid>
    <Canvas x:Name="ContentPanel" Height="768">

    </Canvas>
</Grid>

C #

using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Windows.Media;


public partial class MainPage : PhoneApplicationPage
{
    private static Random random;

    public MainPage()
    {
        InitializeComponent();
        random = new Random();
        this.StartFallingSnowAnimation();
    }

    private Ellipse GenerateEllipse()
    {
        Ellipse element = new Ellipse();
        element.Fill = new SolidColorBrush(Colors.Cyan);
        element.Height = 8.0;
        element.Width = 8.0;
        this.ContentPanel.Children.Add(element);
        return element;
    }

    private Storyboard CreateStoryboard(UIElement element, double to, double toLeft)
    {
        Storyboard result = new Storyboard();
        DoubleAnimation animation = new DoubleAnimation();
        animation.To = to;
        Storyboard.SetTargetProperty(animation, new PropertyPath("(Canvas.Top)"));
        Storyboard.SetTarget(animation, element);

        DoubleAnimation animationLeft = new DoubleAnimation();
        animationLeft.To = toLeft;
        Storyboard.SetTargetProperty(animationLeft, new PropertyPath("(Canvas.Left)"));
        Storyboard.SetTarget(animationLeft, element);

        result.Children.Add(animation);
        result.Children.Add(animationLeft);

        return result;
    }

    private void StartFallingSnowAnimation()
    {
        for (int i = 0; i < 20; i++)
        {
            Ellipse localCopy = this.GenerateEllipse();
            localCopy.SetValue(Canvas.LeftProperty, i * 30 + 1.0);

            double y = Canvas.GetTop(localCopy);
            double x = Canvas.GetLeft(localCopy);

            double speed = 5 * random.NextDouble();
            double index = 0;
            double radius = 30 * speed * random.NextDouble();

            localCopy.Opacity = .3 + random.NextDouble();

            CompositionTarget.Rendering += delegate (object o, EventArgs arg)
            {
                index += Math.PI / (180 * speed);

                if (y < this.ContentPanel.DesiredSize.Height)
                {
                    y += .3 + speed;
                }
                else
                {
                    y = -localCopy.Height;
                }

                Canvas.SetTop(localCopy, y);
                Canvas.SetLeft(localCopy, x + radius * Math.Cos(index));
                Storyboard animation = this.CreateStoryboard(localCopy, y, x + radius * Math.Cos(index));
                Storyboard.SetTarget(animation, localCopy);
                animation.Begin();

            };
        }
    }
}

فإنه يعمل تماما في التطبيق فارغة، ولكن تبدأ متخلفة إذا استخدام في التطبيق بناء مع بعض الضوابط أكثر أو في بناء التطبيق بالكامل.





windows-phone-silverlight