[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
Posted by holland14
: