ItemsControl, VirtualizingStackPanel et ScrollViewer hauteur

Je veux afficher une liste importante d'éléments à l'aide d'un ItemsControl.

La raison pour laquelle je suis à l'aide d'un ItemsControl, c'est que le DataTemplate est beaucoup plus complexe dans l'application que je suis en train de travailler sur: L'exemple de code fourni ne reflète le dimensionnement problème que j'ai.

Je voudrais :

  • ItemsControl à être virtualisés, car il ya de nombreux éléments à afficher
  • sa taille pour l'étendre à son conteneur parent automatiquement (la Grille)
    <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>

Le code derrière est :

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;
    }
}

Que je me force à le ScrollViewer hauteur de 400px, ItemsControl la virtualisation des œuvres que j'attends: Le ItemsControl affiche la liste très rapidement, quel que soit le nombre d'éléments qu'elle contient.

Cependant, si je supprime Height="400px", la liste va étendre sa hauteur pour afficher la totalité de la liste, indépendamment de son conteneur parent hauteur. Pire: il semble derrière de son contenant.

Mettre un scrollviewer autour de la ItemsControl exprime le résultat visuel, mais la virtualisation s'en va et la liste prend trop de temps à afficher.

Comment puis-je obtenir à la fois automatique de la hauteur de l'expansion et de la virtualisation de mon ItemsControl ?

OriginalL'auteur |