【问题标题】:Let ListView scroll to selected item让 ListView 滚动到所选项目
【发布时间】:2012-08-24 11:23:14
【问题描述】:

我有一个 WinRT/C#/XAML 应用程序,其视图具有垂直的 ListView 项目。根据项目的数量,ListView 会显示一个垂直滚动条。这是 XAML 定义:

<UserControl.Resources>
    <CollectionViewSource
        x:Name="myViewSource"
        Source="{Binding myViewModel.Items}" />
</UserControl.Resources>
...
<ListView
    x:Name="myListView"
    ItemsSource="{Binding Source={StaticResource myViewSource}}"
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
</ListView>

现在,每次我导航到此视图时,ListView 的选定项都是通过从后面的代码 (OnNavigatedTo) 设置视图模型中的数据绑定 SelectedItem 属性来选择的。我的问题: ListView 不会自动滚动到这个选定的项目。滚动条保持在 ListView 的顶部,用户必须手动滚动才能看到选定的项目。

在后面的代码(OnNavigatedTo)中设置 SelectedItem 后,我尝试执行 myListView.ScrollIntoView(MyViewModel.SelectedItem);,但它不起作用。滚动条保持在顶部。

我知道 SO:Scroll WinRT ListView to particular group 上的这个帖子。 这似乎是一个类似的问题。但是当我手动或使用 WinRT XAML 工具包遍历 ListView 的可视化树时,它找不到 ScrollViewer(而是返回 null)。

【问题讨论】:

  • 在您尝试滚动之前,您是否正在等待 ListView 加载(被添加到可视化树中)?
  • 我在 OnNavigatedTo() 中调用 ScrollIntoView()。我认为这将是正确的位置,并且应该已加载 ListView。还是我错了?
  • 我认为 OnNavigatedTo 发生在控件加载之前...

标签: xaml windows-runtime winrt-xaml


【解决方案1】:

感谢 Filip,我注意到在 OnNavigatedTo() 中调用 ScrollIntoView() 为时过早,因为该位置尚未加载 ListView 控件。

第一个解决思路是绑定ListView的Loaded事件:

myListView.Loaded += (s, e) => 
    myListView.ScrollIntoView(MyViewModel.SelectedItem);

不幸的是,这会导致令人讨厌的视觉效果,其中当前 ListView 项目与所选项目重叠部分秒,然后一切都重新安排好。

我找到的最终解决方案是通过视图的Dispatcher异步调用ScrollIntoView()

myListView.Loaded += (s, e) => Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    () => myListView.ScrollIntoView(MyViewModel.SelectedItem));

使用此解决方案,布局工作正常。

【讨论】:

  • 在我的情况下 myListView.UpdateLayout() 在 myListView.ScrollIntoView() 之前也有帮助
【解决方案2】:

我有类似的需求,并以稍微不同的方式解决了它。我从 ListView 订阅了 SelectionChangedEvent 并在处理程序中执行了滚动。

XAML:

<ListView x:Name="myListView" SelectionChanged="myListView_SelectionChanged" ...>
</ListView>

代码:

private void myListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    myListView.ScrollIntoView(myListView.SelectedItem);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多