반응형
사용자 컨트롤을 마우스 좌측 버튼을 눌러서 이동시키고자 할 경우 유용하게 사용할 수 있는 코드이다.
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 |