ItemsControl的,VirtualizingStackPanel和ScrollViewer中

2019-08-19 01:59发布

我想显示使用一个ItemsControl项目的重要名单。

为什么我使用一个ItemsControl的原因是DataTemplate中是在我工作的应用程序要复杂得多:只有提供的代码示例体现了大小的问题,我有。

我想要 :

  • 进行虚拟化ItemsControl的,因为有很多是项目展示
  • 其大小自动扩展到其父容器(网格)

     <Grid> <ItemsControl x:Name="My" ItemsSource="{Binding Path=Names}"> <ItemsControl.Template> <ControlTemplate> <StackPanel> <StackPanel> <TextBlock Text="this is a title" FontSize="15" /> <TextBlock Text="This is a description" /> </StackPanel> <ScrollViewer CanContentScroll="True" Height="400px"> <VirtualizingStackPanel IsItemsHost="True" /> </ScrollViewer> </StackPanel> </ControlTemplate> </ItemsControl.Template> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding}" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Grid> 

后面的代码是:

public partial class Page1: Page
{
    public List<string> Names { get; set; }
    public Page1()
    {
        InitializeComponent();

        Names = new List<string>();
        for(int i = 0; i < 10000; i++)
            Names.Add("Name : " + i);

        My.DataContext = this;
    }
}

正如我强迫的ScrollViewer高度400像素,ItemsControl的虚拟化工程,我所期待的:ItemsControl中很快显示不管它有多少项包含列表。

但是,如果我删除HEIGHT =“400像素”,名单将扩大其高度来显示整个列表,无论它的父容器高度。 更糟的是:它似乎它的容器后面

把周围的ItemsControl的一个ScrollViewer中给出了预期的视觉效果,但虚拟化将消失,列表需要太多的时间来显示。

我怎样才能实现我的ItemsControl的两个自动高度扩展和虚拟化?

Answer 1:

问题是在ItemsControl.Template:您使用的StackPanel存在,这给她的孩子,因为他们希望尽可能多的高度。 它替换成类似

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel>
        <TextBlock Text="this is a title" FontSize="15" />
        <TextBlock Text="This is a description" />
    </StackPanel>
    <ScrollViewer CanContentScroll="True" Grid.Row="1">
        <VirtualizingStackPanel />
    </ScrollViewer>
</Grid>

它应该工作的罚款。

希望能帮助到你。



文章来源: ItemsControl, VirtualizingStackPanel and ScrollViewer height