TreeView滚动TreeViewItem
今天帮忙修了一个bug, 在拖动TreeViewItem时,需要滚动TreeView向前翻页,或向后翻页。
思路:
1.找到TreeView控件里的ItemsControl
2.找到ItemsControl里的ScrollViewer
3.判断当前每个Item的高度
4.通过GetCursorPos获取屏幕绝对坐标
5.通过ItemsControl的PointFromScreen把屏幕坐标转为相对于ItemsControl的客户坐标
6.判断当前坐标是否超出第一Item或者最后一个Item
7.如果超出第一个Item则向上滚动, 如果超出最后一个Item则向下滚动。
[StructLayout(LayoutKind.Sequential)] public struct POINT { public int X; public int Y; public POINT(int x, int y) { this.X = x; this.Y = y; } public override string ToString() { return ("X:" + X + ", Y:" + Y); } } [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern bool GetCursorPos(out POINT pt);private void ScrollItemToView(object sender) { ItemsControl itemsControl = sender as ItemsControl; if (null == itemsControl) { return; } if (null == this.targetItemContainer) { return; } ScrollViewer scv = Utilities.FindChild<ScrollViewer>(itemsControl); if (null != scv) {//每个Item的Container的高度 double itemHeight = this.targetItemContainer.ActualHeight; POINT currentPosition = new POINT(); GetCursorPos(out currentPosition); Point relativePos = itemsControl.PointFromScreen(new Point(currentPosition.X, currentPosition.Y)); if (relativePos.Y >= itemsControl.ActualHeight - itemHeight) { scv.ScrollToVerticalOffset(scv.VerticalOffset + itemHeight); } else if (relativePos.Y <= itemHeight) { scv.ScrollToVerticalOffset(scv.VerticalOffset - itemHeight); } } }
https://muzizongheng.blog.csdn.net/