이번 시간에는 위 동영상과 같이 마우스가 움직일 때 마다 원이 나타나는 효과를 구현해 보았습니다. (동영상을 올릴때 압축이 되서 그런지 약간 지저분해 보이기도 하네요ㅎㅎ) 소스코드는 아래와 같습니다.
|
[XAML] |
|
<Window x:Class="WPFClock.Window1" xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml Title="Window1" Height="300" Width="300"> <Window.Resources> <Style TargetType="Ellipse"> <Setter Property="RenderTransform"> <Setter.Value> <ScaleTransform ScaleX="1" ScaleY="1"/> </Setter.Value> </Setter> <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/> </Style> <Storyboard x:Key="EllipseStoryBoard"> <DoubleAnimation To="8" toryboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)"/> <DoubleAnimation To="8" toryboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)"/> <DoubleAnimation To="0" Storyboard.TargetProperty="(UIElement.Opacity)"/> </Storyboard> </Window.Resources> <Canvas x:Name="Root"/> </Window> |
|
[C#] |
|
public partial class Window1 : Window {
public Window1() { InitializeComponent(); this.MouseMove += new MouseEventHandler(Window1_MouseMove); }
void Window1_MouseMove(object sender, MouseEventArgs e) { Point Pt = e.GetPosition(this); Add(Pt.X, Pt.Y); }
//마지막으로 객체가 생성된 시간 TimeSpan LastAdd; public void Add(double X, double Y) {
if ((DateTime.Now.TimeOfDay - LastAdd).Milliseconds < 50) return; LastAdd = DateTime.Now.TimeOfDay;
Ellipse Ellipse = new Ellipse(); Ellipse.Stroke = GetRandomColorBrush();
int Size = (Byte)Rnadom.Next(5, 15); Ellipse.Width = Ellipse.Height = Size; Ellipse.Name = "_" + Ellipse.GetHashCode().ToString();
Canvas.SetLeft(Ellipse, X - Size / 2); Canvas.SetTop(Ellipse, Y - Size / 2);
Root.RegisterName(Ellipse.Name, Ellipse); Root.Children.Add(Ellipse);
Storyboard EllipseStoryboard = (Resources["EllipseStoryBoard"] as Storyboard).Clone(); Storyboard.SetTargetName(EllipseStoryboard, Ellipse.Name);
EllipseStoryboard.Completed += new EventHandler(EllipseStoryboard_Completed); Ellipse.BeginStoryboard(EllipseStoryboard);
}
SolidColorBrush GetRandomColorBrush() { Random Rnadom = new Random(DateTime.Now.Millisecond); Color StrokeColor = Color.FromArgb( (Byte)Rnadom.Next(80, 255), (Byte)Rnadom.Next(0, 255), (Byte)Rnadom.Next(0, 255), (Byte)Rnadom.Next(0, 255) ); return new SolidColorBrush(StrokeColor);
}
void EllipseStoryboard_Completed(object sender, EventArgs e) {
Storyboard Storyboard = (sender as ClockGroup).Timeline as Storyboard; Ellipse Ellipse = FindName(Storyboard.GetTargetName(Storyboard)) as Ellipse;
Root.UnregisterName(Ellipse.Name); Root.Children.Remove(Ellipse);
} } |
코드가 꾀 길어 보이지만 실제로는 복잡한 내용은 없으니 한줄 한줄 천천히 살펴보시면 이해 하실 수 있을 것입니다. (혹시 이해가 잘 안 되는 부분이나 추가 설명이 필요한 부분은 댓글 달아주시면 설명 해드리도록 하겠습니다.)