2010-11-10 3 views
0

Je cherche un moyen de dessiner des lignes pointillées pour connecter des nœuds dans un wpf TreeView. Le problème semble être que j'utilise HierarchicalDataTemplate au lieu de remplir le TreeView avec TreeViewItem s.Lignes pointillées pour connecter des nœuds dans un wpf TreeView

J'ai trouvé ce post: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/30cb182c-9419-40bd-946e-87971515fb95/

sorcière résout grand dans le cas où le peuplant TreeViewItem s mais ma question est, comment pourrais-je résoudre avec HierarchicalDataTemplate?

Mon apparence modèle quelque chose comme ceci:

<HierarchicalDataTemplate DataType = "{x:Type Team}" ItemsSource ="{Binding Path=Players"> 
    <TextBlock Text="{Binding Path=Name}" /> 
</HierarchicalDataTemplate> 

<DataTemplate DataType = "{x:Type Player}"> 
    <TextBlock Text="{Binding Path=Name}" /> 
</DataTemplate > 

Toute solution ou bien des conseils sur la façon de résoudre le problème?

Répondre

0

Les moyens les plus simples, à mon avis, est d'ajouter le code dans le ItemStyle

<HierarchicalDataTemplate.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <!--your style--> 
    </Style> 
</HierarchicalDataTemplate.ItemContainerStyle> 
0

À mon avis, la meilleure façon de résoudre ce genre de problème est:

  1. Mettre en oeuvre un décorateur « ConnectingLineDecorator » que vous pouvez inclure dans le ItemTemplate.
  2. Définir une propriété attachée héritée ConnectionLineDecorator.ParentDecorator.
  3. En MeasureOverride faire un SetParentDecorator(Child, this) afin que les décorateurs descendants peuvent trouver leur parent
  4. Dans le PropetyChangedCallback pour le code de la propriété add ParentDecorator qui enregistre chaque décorateur avec son ParentDecorator, la création d'un arbre de décorateurs.
  5. Chaque fois que les décorateurs d'un décorateur d'un décorateur changent, planifiez un rappel Dispatcher pour recalculer quels enfants décorateurs doivent afficher les lignes et combien de temps ces lignes doivent être.
  6. Utilisez un Adorner avec chaque décorateur pour détecter les changements de position absolus. Lorsqu'un décorateur se déplace par rapport à son parent, planifiez le même rappel Dispatcher pour recalculer les lignes.
  7. Dans OnRender, les lignes sont réellement restituées à l'aide des données de ligne les plus récentes (ou dans l'Adorner, mais si c'est le cas, vous devez assurez-vous que l'AdornerLayer est au bon niveau)

Cette approche ne nécessite pas beaucoup de code et est totalement fiable, car elle ne se soucie pas du type de panneaux que vous utilisez, du fonctionnement du défilement ou même l'arbre est réellement construit. Le décorateur connaît son métier et le fait: il ne fait que tracer des lignes entre lui et ses décorateurs ancêtres.

+1

c'est un cas magistral de SCOGTFO: code source ou GTFO :) – sam

Questions connexes