在Silverlight中使用ItemsControl进行UI虚拟化

前端之家收集整理的这篇文章主要介绍了在Silverlight中使用ItemsControl进行UI虚拟化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个相当大的文本块的滚动列表.我希望有一个垂直滚动条来显示它们,如果它们溢出一定的大小,我希望它们显示省略号.我实际上所有这些工作都非常好.

我有以下Silverlight XAML:

<Grid x:Name="LayoutRoot" MaxWidth="500" MinWidth="100"
    MaxHeight="500" MinHeight="100">
    <Grid.DataContext>
        <app:MainPageviewmodel/>
    </Grid.DataContext>
    <ScrollViewer>
    <ItemsControl ItemsSource="{Binding TextItems}" Margin="0,20,20">
        <ItemsControl.ItemTemplate><DataTemplate>
            <Border MaxHeight="175" Margin="0,18" CornerRadius="5">
                <TextBlock Margin="2" TextTrimming="WordEllipsis"
                     TextWrapping="Wrap" Text="{Binding}"/>
            </Border>
         </DataTemplate></ItemsControl.ItemTemplate>
    </ItemsControl>
    </ScrollViewer>
</Grid>

我的问题是这种布局不使用UI虚拟化,例如使用VirtualizingStackPanel.所以它很慢.将UI虚拟化纳入此布局的最佳方法是什么?我已经尝试了大约六种不同的方式,但没有任何方法能够很好地解决问题.

我设法让它在ListBox中工作,因为它似乎支持虚拟化开箱即用.但是,我更喜欢使用ItemsControl,因为我不希望这些东西可以选择,我不希望ListBox附带的样式.

这在Silverlight 4中.

解决方法

要完成这项工作,您需要做一些事情.

>为ItemsPanelTemplate设置
你的ItemsControl到了
VirtualizingStackPanel.
>将ScrollViewer合并到里面
一个ControlTemplate为您的
ItemsControl而不仅仅是
把它包在外面.
>确保ItemsControl具有固定高度,以便布局系统可以计算出填充视口所需的项目数. (看起来你已经通过将ItemsControl放在网格中来实现这一点 – 这将允许布局系统确定控件的分配高度)

这是我能想到的最简单的例子:

<ItemsControl ItemsSource="{Binding TextItems}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.Template>
            <ControlTemplate TargetType="ItemsControl">
                <Border>
                    <ScrollViewer>
                        <ItemsPresenter/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </ItemsControl.Template>
    </ItemsControl>

猜你在找的Silverlight相关文章