3

我的主应用程序页面中有一个 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

非常感谢任何帮助!

谢谢

4

2 回答 2

7

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

  1. GridViewItem使用GridView's获取项目容器,在本例中为 a ItemContainerGenerator
  2. 获取. GridView_ ScrollViewer你可以搜索FindVisualChild<T>方法,周围有很多。
  3. 执行MyGridViewItem.TransformToVisual(MyGridViewScrollViewer).TransformPoint(new Point(0, 0));此操作将使您获得项目的左上角,相对于整个可滚动面板(称为它的ExtentScrollViewer(这将在稍后很重要)。

这将返回给您一个Point对象。

接下来,我们需要找出X当前显示在ScrollViewer.

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

  1. 采取HorizontalOffset. 这是当前可视区域的当前“下限”。
  2. HorizontalOffset加号ViewportWidth。这是当前可视区域的上限。
  3. 如果您Point.X大于您的下限且小于您的上限,则该项目是可见的。

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

希望这会有所帮助,并祝您编码愉快!

于 2013-05-23T17:08:38.250 回答
0

您可以VisualTreeHelper按照 Nate 的建议使用来扫描可视化树,但通常不建议在运行时这样做,尤其是对于紧密循环(例如检查大量GridViewItem对象)或复杂的可视化树。你可以做一个小的改进,只计算一次这些项目的位置,然后根据ScrollViewer.ViewChanged事件和偏移值做一个简化的检查,但这似乎还是有点太复杂了。

如果您GridView使用ItemsPanel支持虚拟化的(例如默认WrapGrid) - 大多数实际加载到GridView项目中的项目实际上是可见的或离屏幕不远,所以如果您使用绑定GridView到视图模型的集合ItemsSource- 您可以弄清楚当通过绑定到它们的属性或处理Loaded/Unloaded事件来访问这些项目时,ItemTemplate并回调视图模型以了解它们何时被访问。这样,您可以在这些项目首次出现在屏幕上时开始加载它们,并留下逻辑来确定是否应将它们加载到平台中的列表控件虚拟化实现中。

于 2013-05-23T20:14:16.013 回答