■ UIElement 클래스의 MouseDown/MouseMove/MouseUp 이벤트를 사용해 엘리먼트를 이동시키는 방법을 보여준다.
▶ MainWindow.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<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="UIElement 클래스 : MouseDown/MouseMove/MouseUp 이벤트를 사용해 엘리먼트 이동시키기" FontFamily="나눔고딕코딩" FontSize="16"> <Canvas> <Label Name="label" Canvas.Left="100" Canvas.Top="100" Padding="10" Background="Goldenrod" Content="Label" /> </Canvas> </Window> |
▶ MainWindow.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace TestProject { /// <summary> /// 메인 윈도우 /// </summary> public partial class MainWindow : Window { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 베이스 포인트 /// </summary> private Point basePoint = new Point(0.0, 0.0); /// <summary> /// 엘리먼트 내 마우스 포인트 /// </summary> private Point mousePointInElement; /// <summary> /// 델타 X /// </summary> private double deltaX = 0.0; /// <summary> /// 델타 Y /// </summary> private double deltaY = 0.0; /// <summary> /// 드래그 여부 /// </summary> private bool isDragging = false; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainWindow() /// <summary> /// 생성자 /// </summary> public MainWindow() { InitializeComponent(); this.label.MouseDown += label_MouseDown; this.label.MouseMove += label_MouseMove; this.label.MouseUp += label_MouseUp; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 레이블 마우스 DOWN 처리하기 - label_MouseDown(sender, e) /// <summary> /// 레이블 마우스 DOWN 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void label_MouseDown(object sender, MouseButtonEventArgs e) { Label label = e.Source as Label; if(label != null) { label.CaptureMouse(); this.isDragging = true; this.mousePointInElement = e.GetPosition(label); } } #endregion #region 레이블 마우스 이동시 처리하기 - label_MouseMove(sender, e) /// <summary> /// 레이블 마우스 이동시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void label_MouseMove(object sender, MouseEventArgs e) { if(this.isDragging) { Point mousePoint = e.GetPosition(null); this.deltaX = mousePoint.X - this.basePoint.X - this.mousePointInElement.X; this.deltaY = mousePoint.Y - this.basePoint.Y - this.mousePointInElement.Y; Canvas.SetLeft(this.label, this.basePoint.X + this.deltaX); Canvas.SetTop (this.label, this.basePoint.Y + this.deltaY); } } #endregion #region 레이블 마우스 UP 처리하기 - label_MouseUp(sender, e) /// <summary> /// 레이블 마우스 UP 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void label_MouseUp(object sender, MouseButtonEventArgs e) { Label label = e.Source as Label; if(label != null) { label.ReleaseMouseCapture(); this.basePoint.X += deltaX; this.basePoint.Y += deltaY; this.deltaX = 0.0; this.deltaY = 0.0; this.isDragging = false; } } #endregion } } |