问:在页面导航中,离开ItemsPage有两种可能,1、导航到GroupDetailPage2、返回到HomePage。如果是情况1,我们需要保存ItemsPage的数据,并且当从GroupDetailPage返回到ItemsPage的时候恢复数据,在这种情景下,有一个疑问。ItemsPage里呈现数据采用的是GridView控件,当从ItemsPage导航到DetailPage的时候,无法得到我当前这个GridView滑动到了什么位置,并且当从GroupDetailPage返回时,也无法用代码将GridView滑动到某个特定位置。GridView的设置是SelectionMode="None"
IsItemClickEnabled="True"

答:

对于提到如何获取GridView中ScrollViewer的位置,我们可以通过visualtreehelper来获取页面上的控件以及他们的子控件,因为GridView中的ScrollViewer没有直接暴露出来可被调用。

在我们的场景里,首先需要获取的是GridView以及其中的ScrollViewer,然后通过ScrollViewer的HorizontalOffsetVerticalOffset属性来获取当前ScrollViewer滚动到的位置。

//根据控件类型及名称,获取其子控件

public T GetVisualChild<T>(DependencyObject parent) where T : DependencyObject

        {

            T child = default(T);

           
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);

           
for (int i = 0; i < numVisuals;
i++)

           
{

               
DependencyObject v = (DependencyObject)VisualTreeHelper.GetChild(parent, i);

               
child = v as T;

               
if (child == null)

                   
child = GetVisualChild<T>(v);

               
if (child != null)

                  
break;

           
}

           
return child;

      
}

//获取scrollViewer偏移量

ScrollViewer sv =GetVisualChild<ScrollViewer>(itemGridView);

double hp =sv.HorizontalOffset;

double vp =sv.VerticalOffset;

 

可以在下一次页面加载时(Page_Loaded函数),通过ScrollToHorizontalOffsetScrollToVerticalOffset的方法来设置GridView中ScrollViewer的在特定偏移量下的显示。