Windows runtime 什么';它在滚动查看器中可见吗?

Windows runtime 什么';它在滚动查看器中可见吗?,windows-runtime,windows-store-apps,winrt-xaml,Windows Runtime,Windows Store Apps,Winrt Xaml,我有一个GridView。我正在使用嵌套的ScrollViewer的捕捉点将每条记录捕捉到视图中。因为这只是一个可视更改,而不是数据更改,我如何确定哪些记录当前可见?类似于SelectedItem,但这是一个可视化查询。我可以检查每一张记录,但似乎效率很低。想法?在您的案例中,您可以使用WinRT XAML工具包中的VisualTreeHelperExtensions执行类似操作 gridView .GetDescendantsOfType<GridViewItem>()

我有一个
GridView
。我正在使用嵌套的
ScrollViewer
捕捉点
将每条记录捕捉到视图中。因为这只是一个可视更改,而不是数据更改,我如何确定哪些记录当前可见?类似于
SelectedItem
,但这是一个可视化查询。我可以检查每一张记录,但似乎效率很低。想法?

在您的案例中,您可以使用WinRT XAML工具包中的
VisualTreeHelperExtensions
执行类似操作

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

你是否需要一些实际可见的东西,或者它是否足以让虚拟化的东西(现在有
GridViewItems
表示它们)?有趣的是,我今天(今晚)确实需要同样的功能。我可能会研究一种扩展方法……你找到解决方案了吗?没什么了不起的。现在,我只需从我的工具包中调用
getDegenantSoftype()
扩展方法,它使用
VisualTreeHelper
获取给定类型的所有元素。在这种情况下,为什么不只使用项呢?或者如果您正在绑定,则强制转换项资源?如果您的列表是虚拟化的,那么可视化树中的
GridViewItems
位于视口中或视口附近,因此它们基本上与“当前可见”相同。如果您需要查看可视化树中的哪些,您可以抓取它们的边界矩形并查看它们是否在视图端口内。我希望这样更简单
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));