c# - La animación del guión gráfico se está retrasando
animation storyboard (0)
Creé una animación de caída de nieve, pero está un poco retrasada, si creo esta animación en una nueva aplicación en blanco, funciona bien, pero si intentas construir algunas cosas más y usarla completamente, la aplicación se iniciará.
XAML
<Grid>
<Canvas x:Name="ContentPanel" Height="768">
</Canvas>
</Grid>
DO#
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();
};
}
}
}
funciona perfectamente en una aplicación vacía, pero comienza a retrasarse si se usa en la construcción de la aplicación con algunos controles más o en la aplicación de compilación completa.