代码之家  ›  专栏  ›  技术社区  ›  gmang

WPF ListView带有ScrollViewer的大列表,VisualTree元素未全部加载

  •  0
  • gmang  · 技术社区  · 10 年前

    我有一个WPF列表视图,ScrollViewer会显示大列表。ListView包含带有复选框元素的项。我们为用户提供了选择全部和取消选择全部的功能。

    我遇到的问题只是列表更大,这意味着我们看到了元素的子集,用户需要使用滚动条来查看其余的元素。我用于选择所有元素和取消选择所有元素的代码是使用VisualTreeHelper助手类将复选框的属性IsChecked设置为true或false。然而,它只适用于可见的元素。例如,如果我有一个具有14个复选框的集合,其中10个复选框在屏幕上可见,则它只选择可见的10个复选。然而,在单击全选之前,如果您上下滚动并查看项目,那么它将选择所有14……因此VisualTree似乎只加载所需的元素。有没有办法迫使它加载所有元素?

    我可以通过禁用ListView上的ScrollViewer并用ScrollViewer包围它来使它工作。这是正确的方法吗?

    之前:

    <ListView x:Name="lstProducts" ItemsSource="{Binding Products}" ItemContainerStyle="{StaticResource STYLE_LISTVIEWITEM}" Grid.Row="1" Margin="4" SelectionMode="Multiple" />
    

    有效的解决方案:

    <ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Auto" Grid.Row="1">
                        <ListView x:Name="lstProducts" ItemsSource="{Binding Products}" ItemContainerStyle="{StaticResource STYLE_LISTVIEWITEM}" Grid.Row="1" Margin="4" SelectionMode="Multiple" ScrollViewer.CanContentScroll="False" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled" />
    </ScrollViewer>
    

    请告知!

    1 回复  |  直到 10 年前
        1
  •  2
  •   Dean Chalk    10 年前

    尝试使用 <ListView VirtualizingStackPanel.IsVirtualizing="false" /> 关闭虚拟化,因为listview容器正在被回收,只有可见的容器存在。