在ScrollViewer中可以看到什么?

时间:2014-04-24 04:12:11

标签: windows-runtime windows-store-apps winrt-xaml

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

1 个答案:

答案 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));