private bool SelectPageUpDown(bool down)
{
List<MultiSelectTreeViewItem> items = MultiSelectTreeView.RecursiveTreeViewItemEnumerable(treeView, false, false).ToList();
MultiSelectTreeViewItem item = GetFocusedItem();
if (item == null)
{
return down ? SelectLastFromKey() : SelectFirstFromKey();
}
double targetY = item.TransformToAncestor(treeView).Transform(new Point()).Y;
FrameworkElement itemContent = (FrameworkElement) item.Template.FindName("headerBorder", item);
double offset = treeView.ActualHeight - 2 * itemContent.ActualHeight;
if (!down) offset = -offset;
targetY += offset;
while (true)
{
var newItem = down ? treeView.GetNextItem(item, items) : treeView.GetPreviousItem(item, items);
if (newItem == null) break;
item = newItem;
double itemY = item.TransformToAncestor(treeView).Transform(new Point()).Y;
if (down && itemY > targetY ||
!down && itemY < targetY)
{
break;
}
}
return SelectFromKey(item);
}