드래그 앤 드롭
.NET프로그래밍/Silverlight 3.0 2009. 12. 1. 12:24 |[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));
}
}
}
'.NET프로그래밍 > Silverlight 3.0' 카테고리의 다른 글
이벤트 라우팅(Event Routing) (0) | 2009.12.01 |
---|---|
InkPresenter : 잉크 (0) | 2009.12.01 |
TextBlock 컨트롤 : 텍스트 출력 (0) | 2009.12.01 |
PasswordBox 컨트롤 (0) | 2009.12.01 |
TextBox 컨트롤 (0) | 2009.12.01 |