2011년 10월 18일 화요일

[Silverlight] Drag & Drop


현재는 지정한 컨트롤의 모든영역에서 이벤트가 발생됨;;

특정 컨트롤에만 적용시키기위해서는 좀더 업데이트를 해야됨


Usage : DragnDropUtil.newInstance([Control]);


namespace Util
{
    /// <summary>
    /// Drag & Drop 적용
    /// </summary>      
    public partial class DragnDropUtil
    {
        private System.Windows.Controls.Control control;
        private bool isTrackingMouse = false;
        private Point mouseOffset;
        TranslateTransform renderTransform;
        private DragnDropUtil(System.Windows.Controls.Control control)
        {
            this.control = control;
            this.control.RenderTransform = renderTransform = new TranslateTransform();
            this.control.MouseLeftButtonUp += new MouseButtonEventHandler(MouseLeftButtonUp);
            this.control.MouseLeftButtonDown += new MouseButtonEventHandler(MouseLeftButtonDown);
            this.control.MouseMove += new MouseEventHandler(MouseMove);
        }
        internal static DragnDropUtil newInstance(System.Windows.Controls.Control control)
        {
            return new DragnDropUtil(control);
        }

        void MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            mouseOffset = e.GetPosition(null);
            control.CaptureMouse();
            isTrackingMouse = true;
        }

        void MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            control.ReleaseMouseCapture();
            isTrackingMouse = false;
        }

        void MouseMove(object sender, MouseEventArgs e)
        {
            if (isTrackingMouse)
            {
                Point point = e.GetPosition(null);
                double x0 = this.renderTransform.X;
                double y0 = this.renderTransform.Y;
                this.renderTransform.X = x0 + point.X - mouseOffset.X;
                this.renderTransform.Y = y0 + point.Y - mouseOffset.Y;
                mouseOffset = point;
            }
        }
    }
}

댓글 없음:

댓글 쓰기