private static void OnCountPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { var element = sender as FrameworkElement; if (element == null) { return; } if (GetCount(element) >= 20) { var x = (0.6 * rand.NextDouble() + 0.2) * element.ActualWidth; var y = (0.6 * rand.NextDouble() + 0.2) * element.ActualHeight; PoppinStars.LetsPoppin(element, new Point(x, y)); } }
/// <summary> /// サブの星を生成します。 /// </summary> /// <param name="canvas">親パネルを指定します。</param> /// <param name="leftTop">描画する左上点を指定します。</param> /// <param name="rand">描画するためのランダム要素を決定するための乱数ジェネレータを指定します。</param> /// <returns>生成した星を返します。</returns> private UIElement CreateSubStar(Canvas canvas, Point leftTop, Random rand) { var scaling = 0.25; var time = 200; var duration = new Duration(TimeSpan.FromMilliseconds(400)); var size = GetSize(this.AdornedElement); var scaleTransform = new ScaleTransform(scaling, scaling); var transforms = new TransformGroup(); transforms.Children.Add(scaleTransform); var brush = new SolidColorBrush(Color.FromRgb((byte)rand.Next(0x80, 0xff), (byte)rand.Next(0x80, 0xff), (byte)rand.Next(0x80, 0xff))); var star = new PoppinStars() { Width = size.Width, Height = size.Height, RenderTransformOrigin = new Point(0.5, 0.5), RenderTransform = transforms, Fill = brush, Stroke = brush, }; Canvas.SetLeft(star, leftTop.X); Canvas.SetTop(star, leftTop.Y); star.Loaded += (_, __) => { var nominal = star.ActualWidth / 2.0; var r = rand.Next(8, 13) / 10.0; var angle = rand.Next(0, 360); var x = r * nominal * Math.Cos(angle); var y = r * nominal * Math.Sin(angle); var rotateTransform = new RotateTransform(angle); transforms.Children.Add(rotateTransform); var translateTransform = new TranslateTransform(-star.ActualWidth / 2.0, -star.ActualHeight / 2.0); transforms.Children.Add(translateTransform); var storyboard = new Storyboard(); var xTranslateAnimation = new DoubleAnimation() { By = x, Duration = duration, }; Storyboard.SetTarget(xTranslateAnimation, star); Storyboard.SetTargetProperty(xTranslateAnimation, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[2].(TranslateTransform.X)")); storyboard.Children.Add(xTranslateAnimation); var yTranslateAnimation = new DoubleAnimation() { By = y, Duration = duration, }; Storyboard.SetTarget(yTranslateAnimation, star); Storyboard.SetTargetProperty(yTranslateAnimation, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[2].(TranslateTransform.Y)")); storyboard.Children.Add(yTranslateAnimation); if (rand.Next() % 3 == 0) { var rotateAnimation = new DoubleAnimation() { By = 300, Duration = duration, }; Storyboard.SetTarget(rotateAnimation, star); Storyboard.SetTargetProperty(rotateAnimation, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[1].(RotateTransform.Angle)")); storyboard.Children.Add(rotateAnimation); } var xScaleAnimation = new DoubleAnimation() { To = 0, BeginTime = TimeSpan.FromMilliseconds(time), Duration = duration, }; Storyboard.SetTarget(xScaleAnimation, star); Storyboard.SetTargetProperty(xScaleAnimation, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)")); storyboard.Children.Add(xScaleAnimation); var yScaleAnimation = new DoubleAnimation() { To = 0, BeginTime = TimeSpan.FromMilliseconds(time), Duration = duration, }; Storyboard.SetTarget(yScaleAnimation, star); Storyboard.SetTargetProperty(yScaleAnimation, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)")); storyboard.Children.Add(yScaleAnimation); storyboard.Completed += (___, ____) => { canvas.Children.Remove(star); star = null; RemoveAdorner(canvas); }; storyboard.Begin(); }; return(star); }
/// <summary> /// メインの星を生成します。 /// </summary> /// <param name="canvas">親パネルを指定します。</param> /// <param name="leftTop">描画する左上点を指定します。</param> /// <returns>生成した星を返します。</returns> private UIElement CreateMainStar(Canvas canvas, Point leftTop) { var scaling = 0.6; var time = 200; var duration = new Duration(TimeSpan.FromMilliseconds(time)); var size = GetSize(this.AdornedElement); var scaleTransform = new ScaleTransform(scaling, scaling); var transforms = new TransformGroup(); transforms.Children.Add(scaleTransform); var star = new PoppinStars() { Width = size.Width, Height = size.Height, Opacity = 0.0, RenderTransformOrigin = new Point(0.5, 0.5), RenderTransform = transforms, StrokeThickness = 2.0, }; Canvas.SetLeft(star, leftTop.X); Canvas.SetTop(star, leftTop.Y); star.Loaded += (_, __) => { var translateTransform = new TranslateTransform(-star.ActualWidth / 2.0, -star.ActualHeight / 2.0); transforms.Children.Add(translateTransform); var storyboard = new Storyboard(); var opacityAnimation = new DoubleAnimation() { To = 1.0, Duration = duration, }; Storyboard.SetTarget(opacityAnimation, star); Storyboard.SetTargetProperty(opacityAnimation, new PropertyPath(PoppinStars.OpacityProperty)); storyboard.Children.Add(opacityAnimation); var endOpacityAnimation = new DoubleAnimation() { To = 0.0, BeginTime = TimeSpan.FromMilliseconds(time), Duration = duration, }; Storyboard.SetTarget(endOpacityAnimation, star); Storyboard.SetTargetProperty(endOpacityAnimation, new PropertyPath(PoppinStars.OpacityProperty)); storyboard.Children.Add(endOpacityAnimation); var xScaleAnimation = new DoubleAnimation() { To = 1.0, Duration = duration, }; Storyboard.SetTarget(xScaleAnimation, star); Storyboard.SetTargetProperty(xScaleAnimation, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)")); storyboard.Children.Add(xScaleAnimation); var yScaleAnimation = new DoubleAnimation() { To = 1.0, Duration = duration, }; Storyboard.SetTarget(yScaleAnimation, star); Storyboard.SetTargetProperty(yScaleAnimation, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)")); storyboard.Children.Add(yScaleAnimation); storyboard.Completed += (___, ____) => { canvas.Children.Remove(star); star = null; RemoveAdorner(canvas); }; storyboard.Begin(); }; return(star); }