Composant de hiérarchie C# qui charge chaque sous-« dossier » uniquement lorsque vous cliquez dessus ?

StackOverflow https://stackoverflow.com//questions/12675364

Question

je modifie une application Windows qui utilise System.Windows.Control éléments d'interface utilisateur,
Je souhaite laisser l'utilisateur sélectionner un élément dans une hiérarchie, donc quelque chose qui ressemble à ceci :

tree

Sauf qu'il ne s'agit pas de dossiers, mais d'une énorme hiérarchie d'objets distants, très profonde et lente à récupérer.
Charger toute la hiérarchie avant de l'afficher serait trop lent, je dois afficher le premier niveau, puis afficher l'intérieur d'un dossier lorsque l'utilisateur clique dessus.

Je pense utiliser un System.Windows.Control.TreeView et intercepter les événements de sélection sur TreeViewItem éléments pour les remplir en cas de besoin.
QUESTION: Est-ce la meilleure stratégie ou existe-t-il une System.Windows.Control Élément d’interface utilisateur plus approprié pour cela ?

Un composant qui lit le contenu de chaque dossier de l'élément cliqué serait également acceptable.
L'application utilise .NET 4.5.

Était-ce utile?

La solution

Si je comprends bien, vous souhaitez que les nœuds enfants soient chargés uniquement lorsque le nœud parent est développé (par ex.en cliquant sur son icône de développement).Charger des enfants lors de l'expansion du nœud semble en effet mieux que de les charger lors de la sélection du nœud, du point de vue UX.

Je ne connais rien qui fasse cela directement, mais vous pouvez facilement en créer un vous-même.L'approche que j'ai vue pour cela est d'ajouter un nœud factice sous chaque nœud dont les enfants n'ont pas encore été récupérés, et dans le gestionnaire d'événements pour développer un nœud, vérifiez s'il a un nœud factice, et si c'est le cas, chargez ses nœuds enfants réels et remplacez le factice par eux.

Le nœud factice donne l'impression que son parent est extensible (par ex.avoir une icône « + » ou un triangle réduit), ce qui est probablement ce dont vous avez besoin.Si vous mettez "(Chargement...)" ou quelque chose comme le titre du mannequin, vous en tirerez une expérience utilisateur décente.

Autres conseils

1) Créez le TreeView :

System.Windows.Controls.TreeView treeView = new System.Windows.Controls.TreeView();
ContentCanvas.Children.Add(treeView);

2) Insérez le(s) élément(s) racine :

System.Windows.Controls.TreeViewItem root = new System.Windows.Controls.TreeViewItem();
root.Header = repository;
treeView.Items.Add(root);

3) Lorsqu'un élément est sélectionné, ajoutez des sous-éléments si nécessaire :

treeView.SelectedItemChanged += delegate
{
    TreeViewItem item = (TreeViewItem)treeView.SelectedItem;
    SparkleLogger.LogInfo("bla", "object:"+item);
    System.Windows.Controls.TreeViewItem subItem = new System.Windows.Controls.TreeViewItem();
    subItem.Header = "hello";
    item.Items.Add(subItem);
};

L'ajout doit être effectué lors de la première sélection uniquement, sinon les éléments seront dupliqués.
Toute meilleure solution serait la bienvenue !

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