如何确定GridView中哪些项目在当前滚动窗口中可见?

swi*_*ter 3 windows-runtime windows-store-apps

我在主应用程序页面中有一个GridView,我想对当前为用户查看的项目(高优先级)进行一些后台处理,然后当然也执行其他项目(低优先级).

我可以访问ScrollBar和ScrollViewer,但它们都没有告诉我哪些项目在当前滚动窗口中.我可以尝试破解它,但它变得棘手,因为行/列的数量根据滚动区域的大小而变化.

http://msdn.microsoft.com/en-us/library/windows/apps/br209745.aspx http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls .scrollviewer.aspx

任何帮助非常感谢!

谢谢

Nat*_*ond 7

有两种通用方法可以做到这一点.第一个是获取GridViewItem's AutomationPeer,它实际上有一个直接的方法来调用.类信息在这里.我有问题让它实际上可用.幸运的是,还有第二个答案.这将需要一些数学计算,但它是可行的.

  1. GridViewItem使用GridView's 获取项容器,在本例中为a ItemContainerGenerator.
  2. 得到GridViewScrollViewer.你可以搜索FindVisualChild<T>方法,周围有很多.
  3. 难道MyGridViewItem.TransformToVisual(MyGridViewScrollViewer).TransformPoint(new Point(0, 0));这将让你的项目的左上角,相对于整个滚动面板(称为它Extent的)ScrollViewer(这将是重要的更新版本).

这将返回给你一个Point对象.

接下来,我们需要找出X当前显示的值范围ScrollViewer.

注意:如果您使用的是垂直滚动ScrollViewer,请使用Heights.水平,使用Widths.两者都使用.我将使用水平/宽度来做我的例子.

  1. 拿走HorizontalOffset.这是您当前可查看区域的当前"下限".
  2. 就拿HorizontalOffsetViewportWidth.这是当前可视区域的上限.
  3. 如果您Point.X下限大于下限且小于上限,则该项目可见.

如果您还需要查明整个项目是否可见,请执行相同的计算Point.X + GridViewItem.Width.

希望这有帮助,并且编码愉快!