2014-04-24 26 views
0

我有一个GridView。我正在使用嵌套的ScrollViewerSnapPoints将每个记录捕捉到视图中。因为这只是一个视觉上的变化,而不是数据变化,所以我怎样才能确定哪些记录是当前可见的?类似SelectedItem,但是是一个可视化查询。我可以检查每个记录,但似乎效率低下。想法?ScrollViewer中可见什么?

+0

你需要什么东西是真正可见的,还是足以让东西虚拟化(当前有'GridViewItems')? –

+0

有趣的是 - 我今天实际上需要同样的功能(今晚)。我可能会使用扩展方法... –

+0

您是否找到了解决方法? –

回答

1

你的情况,你可以使用从WinRT的XAML工具包VisualTreeHelperExtensions,做这样的事情

gridView 
    .GetDescendantsOfType<GridViewItem>() 
    .Select(gvi => gridView.ItemFromContainer(gvi)); 

它确实有点密集的视觉树搜索,但如果你的GridView使用虚拟化,因为可能是为您的方案确定返回的项目在视图端口中或附近。如果你想更精确,你可以测试边界矩形交点。像这样的东西可能就足够了:

static class RectExtensions 
{ 
    public static bool ContainsPartOf(this Rect bigRect, Rect smallRect) 
    { 
     // this is a very targeted test for horizontally scrollable smallRects inside of a bigRect 
     return bigRect.Left < smallRect.Left && bigRect.Right > smallRect.Left || 
       bigRect.Left < smallRect.Right && bigRect.Right > smallRect.Right; 
    } 
} 

var sv = gridView.GetFirstDescendantOfType<ScrollViewer>(); 
var bigRect = new Rect(0, 0, sv.ActualWidth, sv.ActualHeight); 

gridView 
    .GetDescendantsOfType<GridViewItem>() 
    .Where(gvi => bigRect.ContainsPartOf(gvi.GetBoundingRect(sv))) 
    .Select(gvi => gridView.ItemFromContainer(gvi)); 
+0

在这种情况下,为什么不使用Items?或者如果你有约束力,可以投射ItemsSource? –

+1

那么,如果你的列表被虚拟化了,那么可视化树中的'GridViewItems'就在视口中或附近,所以它们基本上与“当前可见”几乎相同。如果您需要查看视觉树中的哪些 - 您可以抓住它们的边界矩形并查看它们是否位于视图端口内。 –

+0

我希望它更容易 –