-
WPF ListView(ListBox) 드래그 하는 중 스크롤C#/WPF 2018. 1. 31. 11:06
※이 글은 ListView or ListBox에서 Drag기능을 구현한 다음 사용 가능합니다.
ListView나 ListBox 컨트롤(List 컨트롤)에서 Item을 드래그 하며 순서를 바꾸는 도중,
현재 보이는 Item이 아닌 스크롤을 통해 이동하여 위치시켜야 하는 경우가 있습니다.
Drag를 통해 List 컨트롤의 현재 Vertical Scroll을 옮기는 방법입니다.
해당 List 컨트롤에 DragOver EventHandler를 추가해줍니다.
123456789101112131415161718private void MyList_DragOver(object sender, DragEventArgs e){ListView listView = sender as ListView;ScrollViewer scrollViewer = FindVisualChild<ScrollViewer>(MyList);double tolerance = 10;double verticalPos = e.GetPosition(listView).Y;double offset = 1;if (verticalPos < tolerance){scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - offset);}else if (verticalPos > listView.ActualHeight - tolerance){scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + offset);}}cs ListView와 ListBox둘 다 사용 가능합니다. (3번 줄)
MyList는 해당 List 컨트롤의 이름을 넣어주시면 됩니다. (4번 줄)
tolerance는 해당 List 컨트롤의 위, 아래 끝에서 커서가 얼마나 떨어져 있을 때 Scroll을 시작할 지를 정하는 값입니다.
offset은 Scroll할 시에 한 Scroll당 얼만큼 움직일 지를 정하는 값입니다.
다음은 위에서 사용하는 FindVisualChild 함수 입니다.
1234567891011121314151617private static T FindVisualChild<T>(DependencyObject obj)where T : DependencyObject{for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++){DependencyObject child = VisualTreeHelper.GetChild(obj, i);if (child != null && child is T)return (T)child;else{T childOfChild = FindVisualChild<T>(child);if (childOfChild != null)return childOfChild;}}return null;}cs 참고 (링크)
'C# > WPF' 카테고리의 다른 글
WPF System Menu 불러오기 (0) 2018.04.26 WPF Drag, Drop이 되는 ListBox (0) 2018.02.27 WPF 한 ListView(ListBox)에서 Drag Drop (2) 2018.01.30 WPF 새 윈도우 위치 지정 (2) 2018.01.05 WPF 실행파일 위치 알아내는 법 (0) 2017.12.29 댓글