C# 在正确的时间恢复GridView上的滚动位置
我需要在windows应用程序中恢复GridView的滚动位置。我正试图找到调用ScrollViewer.ScrollToHorizontalOffset()的正确时间,并使其成功 如果我在OnNavigatedToOverride中调用它,则它无效: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(); } 如果
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的加载事件首先被命中,然后是页面的加载事件。这将不起作用,因为如果页面加载事件尚未被触发触发后,我们将无法恢复滚动位置,因为将无处滚动。。。