多个ListView UI虚拟化

时间:2015-03-09 14:39:34

标签: listview windows-phone-8.1 winrt-xaml

我有类似下面的代码:

<ScrollViewer>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <ListView ItemsSource="{Binding FewItems}" />
        <ListView ItemsSource="{Binding ManyItems}" Grid.Row="1" />
    </Grid>
</ScrollViewer>

我的问题是第二个列表,它非常大。通常,UI虚拟化会发生,但由于它是在滚动查看器和网格中定义的,因此列表会占用所需的空间。当我加载此页面时,这会导致显着的延迟。

设置列表的最大高度没有任何好处,因为它会导致列表在外部滚动查看器中自行滚动。

我的问题是这些:

  1. 有没有办法强制列表使用虚拟化?
  2. 是否有办法在保持滚动行为的同时执行此操作,因此两个列表都会作为单个控件滚动?
  3. 感谢。

2 个答案:

答案 0 :(得分:2)

虚拟化无法像您观察到的那样在滚动视图中工作。查看您的XAML代码,通过创建组合FewItems和ManyItems的中间集合并将该集合绑定到单个ListView,可以很容易地解决您的问题。如果您需要将来自FewItems的项目设置为与ManyItems中的项目不同,那么您可能会遇到一些挑战,但这些可以通过样式选择器等来克服。

答案 1 :(得分:0)

将其声明为 VirtualizingStackPanel

<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel />
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

。 。

示例:

<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel />
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

<ItemsControl.Template>
    <ControlTemplate TargetType="ItemsControl">
        <Border>
            <ScrollViewer>
                <ItemsPresenter/>
            </ScrollViewer>
        </Border>
    </ControlTemplate>
</ItemsControl.Template>

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="Hello Wworld" />
    </DataTemplate>
</ItemsControl.ItemTemplate>