반응형

사용자 컨트롤을 마우스 좌측 버튼을 눌러서 이동시키고자 할 경우 유용하게 사용할 수 있는 코드이다.

MemoViewControl 클래스는 내가 만든 사용자 컨트롤이며, 이 컨트롤을 선택해서 마우스로 선택/이동 하는 기능을 수행한다.

MemoViewControl 부분을 각자가 만든 UserControl로 바꾸어서 사용하면 된다.

MemoViewControl에 대한 마우스 Down/Up/Move 이벤트를 아래와 같이 처리해서 사용하면 된다.

        private object movingObject;
        private double firstXPos, firstYPos;

        private void MemoView_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed && sender == movingObject)
            {
                MemoViewControl memoCtnl = sender as MemoViewControl;
                Canvas canvas = memoCtnl.Parent as Canvas;
                // Horizontal
                double newLeft = e.GetPosition(canvas).X - firstXPos - canvas.Margin.Left;
                // newLeft inside canvas right-border?
                if (newLeft > canvas.Margin.Left + canvas.ActualWidth - memoCtnl.ActualWidth)
                    newLeft = canvas.Margin.Left + canvas.ActualWidth - memoCtnl.ActualWidth;
                // newLeft inside canvas left-border?
                else if (newLeft < canvas.Margin.Left)
                    newLeft = canvas.Margin.Left;

                memoCtnl.SetValue(Canvas.LeftProperty, newLeft);

                //Vertical
                double newTop = e.GetPosition(canvas).Y - firstYPos - canvas.Margin.Top;
                // newTop inside canvas bottom-border?
                // -- Bottom --
                if (newTop > canvas.Margin.Top + canvas.ActualHeight - memoCtnl.ActualHeight)
                    newTop = canvas.Margin.Top + canvas.ActualHeight - memoCtnl.ActualHeight;
                // newTop inside canvas top-border?
                // -- Top --
                else if (newTop < canvas.Margin.Top)
                    newTop = canvas.Margin.Top;

                memoCtnl.SetValue(Canvas.TopProperty, newTop);
            }
        }

        private void MemoView_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            selectMemo = (MemoViewControl)sender;
            Canvas canvas = selectMemo.Parent as Canvas;

            movingObject = null;
            
            Mouse.Capture(selectMemo);
        }              

        private void MemoView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {            
            selectMemo = (MemoViewControl) sender;
            Canvas canvas = selectMemo.Parent as Canvas;

            firstXPos = e.GetPosition(selectMemo).X;
            firstYPos = e.GetPosition(selectMemo).Y;

            movingObject = sender;            
            Mouse.Capture(null);
        }

 

 

반응형

'C# 개발 > WPF' 카테고리의 다른 글

WPF에서 리소스에 등록된 이미지 가져오기  (0) 2021.08.23
Observable Collection에서 Item 찾기  (0) 2019.01.10
C1 DataGrid 필터링 설정  (0) 2019.01.07

+ Recent posts