我有GridView
。我使用嵌套的ScrollViewer
SnapPoints
将每条记录分成视图。因为这只是一个视觉上的变化,而不是数据变化,我如何确定哪些记录当前可见?像SelectedItem
这样的东西,但是视觉查询。我可以检查每条记录,但看起来效率低下。想法?
答案 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));