2009-07-30 8 views
2

Je me suis un peu codé sur ce point. J'écris un contrôle WPF personnalisé qui est similaire à TreeListView décrit dans This MSDN article ainsi que de nombreux autres endroits sur le net. Une grosse pile de cette chose est coutumière à ce stade, et elle répond assez bien à mes objectifs, sauf sur le front de la virtualisation. Mes modèles TreeView et TreeViewItem ont tous deux utilisé VirtualizingStackPanel s pour présenter leurs articles, et j'ai vérifié que tout ceci est créé comme prévu. La virtualisation fonctionne correctement sur les éléments de niveau racine (seuls les éléments de l'interface utilisateur pour ceux actuellement visibles dans le ScrollViewer sont cuits), et le TreeView s'occupe de ne pas générer les éléments pour les nœuds repliés. Le problème survient lors de l'expansion d'un nœud - tous les éléments sont cuits pour chaque enfant du nœud, même les milliers qui sont hors écran.virtualisation de conteneurs imbriqués (virtualizingstackpanel) à une barre de défilement parent unique dans WPF

Il me semblait que tout ce que je devais faire était en quelque sorte définir la propriété scrollowner des VirtualizingStackPanel imbriquées internes de la même scrollview principale que le niveau de la racine VSP s'accroché par défaut, mais j'ai lu une affiche MSFT here disant que cela ne fonctionnera pas.

Malheureusement, cette chose est lente comme la boue sans la virtualisation se produisant, donc je dois trouver une sorte de solution. Toutes les suggestions seraient grandement appréciées.

+0

Je sais que ça fait longtemps, mais vous souvenez-vous de ce que vous avez fait pour contourner cela? –

+0

Je viens de réaliser que [le compte de David a été inactif pendant un certain temps] (http://stackoverflow.com/users/17784/david-hay?post-filters=All&post-sorts=Newest). Donc, pour ceux qui viennent après moi, [voir ma réponse ci-dessous] (http://stackoverflow.com/a/42842476/3063273) –

Répondre

0

J'avais un lien vers une liste de ce qu'il ne fallait pas faire avec un panneau de pile de virtualisation, mais pour une raison quelconque, la page est vide. Voici une autre page qui parle un peu à ce sujet:

http://www.designerwpf.com/2008/02/12/listview-and-listbox-performance-issues/

et même des liens vers une im parler, mais est toujours vide. Si vous regardez sur cette page, c'est le lien vers le blog de Mark Shurmer. Voici le lien si vous souhaitez essayer:

http://itknowledgeexchange.techtarget.com/wpf/listview-is-it-really-too-slow/

Bea Stollnitz a aussi quelques articles sur ce qui pourrait aider:

Part 1 Part 2 Part 3

Si vous publiez une de votre code, quelqu'un pourrait peut-être un peu démêler les spaghettis pour vous aider à obtenir une meilleure mise en œuvre.

EDIT: Trouvé un lien qui pourrait fonctionner (merci archive.org !!!): http://web.archive.org/web/20080104163725/http://itknowledgeexchange.techtarget.com/wpf/listview-is-it-really-too-slow/

0

Je sais c'est une vieille question, mais était toujours pertinente pour moi.

Dans mon cas, je pensais qu'un TreeView ne le couperait pas parce que j'ai besoin exactement de deux couches, et les types d'éléments affichés sont différents entre les deux couches. En outre, je suis en train de refactoriser une liste de Expander s donc je pensais plus de façon unidimensionnelle.

Mais alors je me suis aperçu que vous pouvez personnaliser l'ItemTemplate du TreeView d'inclure votre propre HierarchicalDataTemplate, et que vous pouvez personnaliser l'ItemTemplate de cette HierarchicalDataTemplate avec votre propre mesure DataTemplate ... Presto! Exactement deux couches avec des choses différentes dans chacun!

Donc, mon point est que le TreeView est assez flexible que vous devriez essayer de ne pas créer votre propre contrôle personnalisé.

Voici ce que je l'ai fait:

XAML:

<Page x:Class="Foo.Views.TreePage" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:Foo.Views" 
     xmlns:viewModel="clr-namespace:Foo.ViewModels" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" 
     Title="Tree page" 
     d:DataContext="{d:DesignInstance Type=viewModel:TreeModel}"> 
    <TreeView 
     VirtualizingPanel.IsVirtualizing="True" 
     VirtualizingPanel.VirtualizationMode="Recycling" 
     ScrollViewer.CanContentScroll="True" 
     VirtualizingPanel.ScrollUnit="Pixel" 
     ItemsSource="{Binding Values}"><!-- IList<Person> --> 
     <TreeView.ItemTemplate><!-- Template for first layer, which has a HierarchicalDataTemplate so that this layer will expand --> 
      <HierarchicalDataTemplate 
       ItemsSource="{Binding Expenses}"><!-- IList<Expense> --> 
       <HierarchicalDataTemplate.ItemTemplate><!-- Template for the second layer, which has a DataTemplate instead of HierarchicalDataTemplate so that this layer won't expand --> 
        <DataTemplate> 
         <TextBlock Text="{Binding Amount}"/><!-- Expense amount in dollars --> 
        </DataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 

       <TextBlock Text="{Binding Name}"/><!-- Person name --> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 
</Page> 

La classe Person:

public class Person 
{ 
    public string Name { get; set; } 
    public List<Expense> Expenses { get; set; } 
} 

La classe Expense:

public class Expense 
{ 
    public double Amount { get; set; } 
} 

Voilà comment il semble:

Screenshot of the above code in action

J'inspectée avec Snoop pour prouver qu'il est l'interface utilisateur Virtualisation. Voici le nombre de TreeViewItem chargé s lorsque l'application est petit:

Screenshot showing the number of elements when the app is small

... Et voici le nombre de TreeViewItem chargé s lorsque l'application est en plein écran (il continue à aller au-delà de cet extrait, mais vous obtenez le idée):

Screenshot showing that there are more elements when the app is fullscreen

maintenant, il est juste la simple question des choses de style pour faire le look de calque imbriqué comme je veux! Edit: Je viens de vérifier que le TreeView virtualise tous ses calques, pas seulement la première couche.

Questions connexes