<?xml version="1.0" encoding="UTF-8"?>
  今天帮忙修了一个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);                 }             }         }