【发布时间】:2020-09-17 03:45:40
【问题描述】:
在我的应用程序中,当我回到图书馆时,我需要选择新创建的文档(注释)。选择库项目后,必须将库滚动到所选项目。
我的库的 OnLoaded 方法:
private async void OnLoaded(object sender, RoutedEventArgs e)
{
await this.ViewModel.InitializeAsync();
// CollectionViewSource of my GridView being filled
ViewModel.CollectionChanging = true;
GroupInfoCVS.Source = ViewModel.GroupsCollection;
ViewModel.CollectionChanging = false;
// Loading Last selected item - THIS CHANGES SELECTION
ViewModel.LoadLastSelection();
}
调用 LoadLastSelection 方法后,选择成功更改(我已经测试过)。这是之后调用的方法(在我们的 GridView 的扩展控件中):
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.SelectedItemsCount = this.SelectedItems.Count;
var newlySelectedItems = e.AddedItems;
if (newlySelectedItems.Any())
{
var item = newlySelectedItems.Last();
ScrollTo(item);
}
}
private void ScrollTo(object item)
{
UpdateLayout();
var itemUI = (FrameworkElement)this.ContainerFromItem(item);
if (itemUI != null)
{
_scrollViewer.UpdateLayout();
_scrollViewer.ChangeView(null, itemUI.ActualOffset.Y - itemUI.ActualHeight, null, false);
}
}
这在大多数情况下也有效。当 itemUI 不为 null 时,该方法成功滚动到所需的项目。当项目开始溢出屏幕大小时,问题就开始了。当项目从屏幕上完全隐藏时,它们就会被虚拟化。这意味着 ContainerFromItem 返回 null,所以我不能获取偏移属性。请记住,这实际上发生在 库的 OnLoaded 方法完成之前。
请帮助我获得这些属性或其他滚动方法的替代方法,这将帮助我成功滚动。
我阅读了很多内容并尝试使用 Dispatcher.RunAsync 和 ScrollIntoView 方法,但我无法产生任何滚动行为。如果您指出如何成功使用它们,那也将是一个很好的帮助。
这是我读过(并尝试过)的内容:
ItemContainerGenerator.ContainerFromItem() returns null?
How to Know When a FrameworkElement Has Been Totally Rendered?
Is there a "All Children loaded" event in WPF
Let ListView scroll to selected item
提前致谢!
重要提示:如果您不想阅读官方答案中的所有对话,请在此处阅读简短的解决方案:
TemplatedControl 的样式已将 ScrollViewer 的名称从“ScrollViewer”更改为“LibraryScrollViewer”,这使得 ScrollIntoView 方法无用。
【问题讨论】:
标签: c# xaml gridview uwp uwp-xaml