728x90
728x170
▶ MainWindow.xaml
<Window x:Class="TestProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="800"
Height="600"
Title="DispatcherTimer 클래스 : 파동 형태로 이동시키기"
FontFamily="나눔고딕코딩"
FontSize="16">
<Canvas Name="canvas" Margin="10">
<Ellipse Name="ellipse" Canvas.Left="0" Canvas.Top="250"
Width="30"
Height="30"
Fill="Orange" />
<Button Name="button" Canvas.Bottom="10" Canvas.Right="10"
Width="100"
Height="30"
Content="실행" />
</Canvas>
</Window>
728x90
▶ MainWindow.xaml.cs
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
namespace TestProject
{
/// <summary>
/// 메인 윈도우
/// </summary>
public partial class MainWindow : Window
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 타이머
/// </summary>
private DispatcherTimer timer;
/// <summary>
/// 진폭
/// </summary>
private const double AMPLITUDE = 50;
/// <summary>
/// 파장
/// </summary>
private const double WAVE_LENGTH = 100;
/// <summary>
/// 주기
/// </summary>
private const double CYCLE = 5;
/// <summary>
/// 시간
/// </summary>
private double time = 0;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainWindow()
/// <summary>
/// 생성자
/// </summary>
public MainWindow()
{
InitializeComponent();
this.timer = new DispatcherTimer();
this.timer.Interval = TimeSpan.FromMilliseconds(100);
this.timer.Tick += timer_Tick;
this.button.Click += button_Click;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 타이머 틱 처리하기 - timer_Tick(sender, e)
/// <summary>
/// 타이머 틱 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void timer_Tick(object sender, EventArgs e)
{
double target = this.canvas.ActualWidth;
double left = Canvas.GetLeft(this.ellipse) + 10;
double top = AMPLITUDE * Math.Sin(2 * Math.PI * this.time / CYCLE - 2 * Math.PI * left / WAVE_LENGTH) + 250;
if(left + this.ellipse.Width > target)
{
this.timer.Stop();
return;
}
this.time = this.time + 0.05;
Canvas.SetLeft(this.ellipse, left);
Canvas.SetTop (this.ellipse, top );
}
#endregion
#region 실행 버튼 클릭시 처리하기 - button_Click(sender, e)
/// <summary>
/// 실행 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void button_Click(object sender, RoutedEventArgs e)
{
this.time = 0;
Canvas.SetLeft(this.ellipse, 0 );
Canvas.SetTop (this.ellipse, 250);
this.timer.Start();
}
#endregion
}
}
728x90
그리드형(광고전용)
'C# > WPF' 카테고리의 다른 글
[C#/WPF] EventManager 클래스 : RegisterClassHandler 정적 메소드를 사용해 라우팅 이벤트 오버라이딩하기 (0) | 2020.12.01 |
---|---|
[C#/WPF] ScaleTransform 클래스 사용하기 (0) | 2020.11.24 |
[C#/WPF] RotateTransform 클래스 사용하기 (0) | 2020.11.24 |
[C#/WPF] 확대/축소/이동 가능한 캔버스 만들기 (0) | 2020.11.15 |
[C#/WPF] DispatcherTimer 클래스 : 원 형태으로 이동시키기 (0) | 2020.11.15 |
[C#/WPF] DispatcherTimer 클래스 : 사각형을 부드럽게 이동시키기 (0) | 2020.11.15 |
[C#/WPF] Control 엘리먼트 : Background 속성에서 null과 Transparent 값 설정시 차이점 비교하기 (0) | 2020.11.06 |
[C#/WPF] LinearGradientBrush 클래스 : 오프셋 값을 사용해 색상 구하기 (0) | 2020.10.28 |
[C#/WPF] 누겟 설치 : FFME.Windows (0) | 2020.10.25 |
[C#/WPF] 커스텀 윈도우 크롬 사용하기 (0) | 2020.10.13 |