드래그 앤 드롭
[MainPage.xaml]
<UserControl x:Class="RiaDragAndDrop.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Canvas Width="400" Height="300" Background="Silver">
<TextBlock x:Name="txtDrag" Text="드래그앤드롭" FontSize="30">
</TextBlock>
</Canvas>
</UserControl>
[MainPage.xaml.cs]
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace RiaDragAndDrop
{
public partial class MainPage : UserControl
{
private bool isMouseDown = false; // 마우스 클릭 중인지
private Point lastPoint = new Point(); // 마지막 커서 위치
private Point offset = new Point(); // 왼쪽 상단과 개체간의 간격/여백
public MainPage()
{
InitializeComponent();
//[1] 마우스 왼쪽 버튼 클릭
this.txtDrag.MouseLeftButtonDown += new MouseButtonEventHandler(txtDrag_MouseLeftButtonDown);
//[2] 마우스 이동(드래그)
this.txtDrag.MouseMove += new MouseEventHandler(txtDrag_MouseMove);
//[3] 마우스 왼쪽 버튼을 뗄 때
this.txtDrag.MouseLeftButtonUp += new MouseButtonEventHandler(txtDrag_MouseLeftButtonUp);
}
void txtDrag_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
isMouseDown = false; // 클릭되지 않은 상태
this.txtDrag.ReleaseMouseCapture(); // 캡쳐된 마우스 정보 해제
}
void txtDrag_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown) // 마우스가 클릭된 상태에서만 드래그를 해주고자한다면???
{
lastPoint = e.GetPosition(null); // 마우스 움직일때의 좌표값 재설정
// TextBlock의 Left와 Top 속성을 재지정
txtDrag.SetValue(Canvas.LeftProperty, lastPoint.X - offset.X); // 현재위치 - TextBlock 의 위치
txtDrag.SetValue(Canvas.TopProperty, lastPoint.Y - offset.Y);
}
}
void txtDrag_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
isMouseDown = true; // 클릭된 상태
this.txtDrag.CaptureMouse(); // 현재 요소에 마우스 클릭시 마우스에 대한 정보를 저장
lastPoint = e.GetPosition(null); // 현재 마우스의 위치값을 Point 형태로 반환
//MessageBox.Show(lastPoint.X.ToString());
offset.X = lastPoint.X - Convert.ToDouble(txtDrag.GetValue(Canvas.LeftProperty));
offset.Y = lastPoint.Y - Convert.ToDouble(txtDrag.GetValue(Canvas.TopProperty));
}
}
}