C# 在正确的时间恢复GridView上的滚动位置

C# 在正确的时间恢复GridView上的滚动位置,c#,windows-8,windows-runtime,windows-store-apps,C#,Windows 8,Windows Runtime,Windows Store Apps,我需要在windows应用程序中恢复GridView的滚动位置。我正试图找到调用ScrollViewer.ScrollToHorizontalOffset()的正确时间,并使其成功 如果我在OnNavigatedToOverride中调用它,则它无效: protected override void OnNavigatedTo(NavigationEventArgs e) { DataContext = LoadModel(); RestoreScrollPos(); } 如果

我需要在windows应用程序中恢复GridView的滚动位置。我正试图找到调用ScrollViewer.ScrollToHorizontalOffset()的正确时间,并使其成功

如果我在OnNavigatedToOverride中调用它,则它无效:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    DataContext = LoadModel();
    RestoreScrollPos();
}
如果我在页面的已加载处理程序中调用它,则它没有效果

private void onPageLoaded(object sender, RoutedEventArgs e)
{
    DataContext = LoadModel();
    RestoreScrollPos();
}
如果我执行以下操作,那么它会工作,但会产生不和谐,因为GridView首先在滚动位置0处绘制,然后捕捉到新的滚动位置

    var dontAwaitHere =
      Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
      delegate()
      {
        RestoreScrollPos();
      });
如果我尝试从默认的VisualStudioGridView项目中重新设置此行为,它似乎大部分时间都可以工作,但我一次都没有看到它工作。我相信存在某种种族状况,我怀疑我把它放在了错误的地方

问题=我应该在哪里调用RestoreScrollPos(),或者我应该在哪里调试它

    private void RestoreScrollPos()
    {
      var scrollViewer = findScrollViewer(itemGridView);
      if (scrollViewer != null)
      {
        scrollViewer.ScrollToHorizontalOffset(100000.0); // TODO test
      }
    }

    public static ScrollViewer findScrollViewer(DependencyObject el)
    {
      ScrollViewer retValue = findDescendant<ScrollViewer>(el);
      return retValue;
    }

    public static tType findDescendant<tType>(DependencyObject el)
      where tType : DependencyObject
    {
      tType retValue = null;
      int childrenCount = VisualTreeHelper.GetChildrenCount(el);

      for (int i = 0; i < childrenCount; i++)
      {
        var child = VisualTreeHelper.GetChild(el, i);
        if (child is tType)
        {
          retValue = (tType)child;
          break;
        }

        retValue = findDescendant<tType>(child);

        if (retValue != null)
        {
          break;
        }
      }

      return retValue;
    }
private void RestoreScrollPos()
{
var scrollViewer=findScrollViewer(itemGridView);
如果(scrollViewer!=null)
{
scrollViewer.ScrollToHorizontalOffset(100000.0);//TODO测试
}
}
公共静态ScrollViewer findScrollViewer(DependencyObject el)
{
ScrollViewer retValue=FindDescentant(el);
返回值;
}
公共静态tType FindDescentant(DependencyObject el)
其中tType:DependencyObject
{
t类型retValue=null;
int childrenCount=VisualTreeHelper.GetChildrenCount(el);
for(int i=0;i
只有在网格完成加载后,才应调用
RestoreScrollPos

public MyPageConstructor()
{
    this.InitializeComponent();
    this.itemGridView.Loaded += (s,e) => itemGridView_Loaded(s, e);
}

private void itemGridView_Loaded(object sender, RoutedEventArgs e)
{
    RestoreScrollPos();
}
至于在何处加载数据,您应该尝试在
LoadState

protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
    DataContext = LoadModel();
    base.LoadState(navigationParameter, pageState);
}
protected override void LoadState(对象导航参数,字典页面状态)
{
DataContext=LoadModel();
LoadState(navigationParameter,pageState);
}

我也试过了,但也没有成功。。。与使用页面的已加载事件的行为相同:(@swinefrest-请参阅我的添加以了解加载数据的位置。我的应用程序执行的操作与此完全相同,因此它确实可以工作(至少对我而言)。我按照你的建议做了…将加载我的模型放在页面的加载事件中,并将恢复滚动位置放在gridview的加载事件中,但没有成功。如果我在这两个事件上都设置了断点,我会看到gridview的加载事件首先被命中,然后是页面的加载事件。这将不起作用,因为如果页面加载事件尚未被触发触发后,我们将无法恢复滚动位置,因为将无处滚动。。。