Question

J'essaie d'afficher environ 1 400 éléments dans un LongListSelector.Bien qu'il affiche correctement les éléments, parfois, lorsque je fais défiler vers le bas si rapidement puis commence à défiler vers le haut, il n'affiche pas tous les éléments, il affiche à peine 100 éléments bien que le contenu de la collection liée ne soit pas modifié dans le backend.

voici mon code d'interface utilisateur :

<phone:PanoramaItem Header="Monitors" Margin="{StaticResource PanoramaItemMargin}" HeaderTemplate="{StaticResource PanoramaItemHeaderTemplate}">
                <phone:LongListSelector ItemsSource="{Binding MonitorRenderList}" VirtualizingStackPanel.VirtualizationMode="Recycling" Margin="-15,-15,0,0">
                    <phone:LongListSelector.ItemTemplate>
                        <DataTemplate>
                            <common:MonitorListTemplateSelector Content="{Binding}" HorizontalAlignment="Left">
                                <common:MonitorListTemplateSelector.MonitorBucket>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding titleUpperCase}" Margin="0,5,10,5" FontWeight="Bold" Foreground="{StaticResource AppForegroundHighlightTextBrush}" TextWrapping="NoWrap" TextTrimming="WordEllipsis" FontSize="{StaticResource RowHeaderFontSize}"/>
                                    </DataTemplate>
                                </common:MonitorListTemplateSelector.MonitorBucket>
                                <common:MonitorListTemplateSelector.MonitorDetails>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding monitorName}" Margin="0,5,10,5" FontSize="{StaticResource TextRowFontSize}" Foreground="{StaticResource AppForegroundNormalTextBrush}" TextWrapping="NoWrap" TextTrimming="WordEllipsis">
                                            <i:Interaction.Triggers>
                                                <i:EventTrigger EventName="Tap">
                                                    <i:InvokeCommandAction Command="{Binding DataContext.SelectedMonitorDetailsCommand, ElementName=LandingPageRoot, Mode=OneTime}" CommandParameter="{Binding}"/>
                                                </i:EventTrigger>
                                            </i:Interaction.Triggers>
                                        </TextBlock>
                                    </DataTemplate>
                                </common:MonitorListTemplateSelector.MonitorDetails>
                                <common:MonitorListTemplateSelector.EmptyLastItem>
                                    <DataTemplate>
                                        <TextBlock Height="72" />
                                    </DataTemplate>
                                </common:MonitorListTemplateSelector.EmptyLastItem>
                            </common:MonitorListTemplateSelector>
                        </DataTemplate>
                    </phone:LongListSelector.ItemTemplate>
                </phone:LongListSelector>
            </phone:PanoramaItem>

MODIFIER: ce problème semble se produire uniquement lorsque LongListSelector est contenu dans Panorama même s'il n'y en a qu'un seul panoramaItem, mais lorsque je le déplace hors du panorama, cela n'arrive pas.

Était-ce utile?

La solution

Il s’agit d’un comportement normal dû à la virtualisation intégrée du contrôle.Lorsque vos collections liées aux données sont trop volumineuses, la virtualisation démarre afin de conserver les performances du contrôle intactes.

Sans la virtualisation de l'interface utilisateur, l'intégralité de l'ensemble de données serait conservée en mémoire et un conteneur d'éléments serait créé pour chacun de vos éléments dans la liste, paralysant les performances de votre application et éventuellement en lançant une OutOfMemoryException qui y mettrait fin.

Avec la virtualisation de l'interface utilisateur, l'ensemble de données est toujours conservé en mémoire, mais un conteneur d'éléments est créé uniquement lorsque l'élément est presque prêt à être affiché dans l'interface utilisateur, ce qui maintient la consommation de mémoire à un faible niveau.

Par défaut, tous les contrôles d'éléments activent la virtualisation de l'interface utilisateur.

MODIFIER

Tiré de Daniel Vaughan - Windows Phone 8 Unleashed, SAMS Publishing

Comme le panorama vise à explorer l'utilisateur, il devrait afficher un contenu intéressant et spécifique à l'utilisateur.L'utilisateur ne doit pas non plus être surchargé avec trop de contenu;pensez à l'espace blanc et pas beaucoup de données.Le panorama doit être considéré comme un lieu de départ, contenant des données et des liens qui emmènent l'utilisateur à des pages de contenu plus détaillées, des pages qui peuvent inclure un pivot par exemple.L'utilisateur est alors en mesure de quitter le style exploratoire du panorama pour le style plus ciblé du pivot.

également à partir de ce lien : http://ux.artu.tv/?p=234

Les panoramas ne peuvent pas contenir de grandes quantités de données.Pour des raisons de performances et d'expérience, n'utilisez pas Panoramas si vous avez besoin de présenter une grande quantité de contenu aux utilisateurs.Combien c'est trop ?En général, restez entre 3 et 5 panneaux Panorama.Utilisez des ListBox qui utilisent un maximum de 15 à 20 éléments.Les panoramas ne sont pas virtualisés (gérés en mémoire), alors considérez-les presque comme de grandes images plates plutôt que des contrôles de contenu dynamiques (comme les pivots).Encore une fois, il s’agit plutôt de couvertures de magazines – belles et immersives.

Autres conseils

Chaque contrôle Silverlight pour Windows Phone a une restriction de taille.Il peut être affiché jusqu'à 2048 pixels en largeur et en hauteur.

Votre problème peut survenir pour cette raison.Avez-vous vérifié ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top