Пунктирные линии для соединения узлов в wpf TreeView - PullRequest
0 голосов
/ 10 ноября 2010

Я ищу способ рисовать пунктирные линии для соединения узлов в wpf TreeView. Кажется, проблема в том, что я использую HierarchicalDataTemplate вместо заполнения TreeView с TreeViewItem s.

Я нашел это сообщение: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/30cb182c-9419-40bd-946e-87971515fb95/

Ведьма прекрасно решает проблему в случае заполнения TreeViewItem с, но мой вопрос, как бы я решил это с HierarchicalDataTemplate?

Мой шаблон выглядит примерно так:

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

Любое решение или хорошие советы о том, как решить проблему?

Ответы [ 2 ]

0 голосов
/ 07 января 2011

Самым простым способом, на мой взгляд, было добавить код в стиле элемента

<HierarchicalDataTemplate.ItemContainerStyle>
   <Style TargetType="{x:Type TreeViewItem}">
      <!--your style-->
   </Style>
</HierarchicalDataTemplate.ItemContainerStyle>
0 голосов
/ 13 ноября 2010

На мой взгляд, самый простой способ решить эту проблему:

  1. Реализация декоратора «ConnectingLineDecorator», который можно включить в шаблон ItemTemplate.
  2. Определите унаследованное вложенное свойство ConnectingLineDecorator.ParentDecorator.
  3. В MeasureOverride выполните SetParentDecorator(Child, this), чтобы потомки-декораторы могли найти своего родителя
  4. В PropetyChangedCallback для свойства ParentDecorator добавьте код, который регистрирует каждый декоратор с помощью своего ParentDecorator, создавая дерево декораторов.
  5. Всякий раз, когда изменяются дочерние декораторы декоратора, запланируйте обратный вызов Dispatcher, чтобы пересчитать, какие дочерние декораторы должны показывать строки и как долго эти строки должны быть.
  6. Используйте Adorner с каждым декоратором для определения абсолютных изменений положения. Когда декоратор перемещается относительно своего родителя, запланируйте тот же обратный вызов Dispatcher для пересчета строк
  7. В OnRender фактически визуализируют линии, используя самые последние данные о линиях (или это можно сделать в Adorner, но если это так, вам нужно убедиться, что AdornerLayer находится на нужном уровне)

Этот подход не требует большого количества кода и является абсолютно надежным, поскольку его не волнует, какие панели вы используете, как работает прокрутка или даже как на самом деле строится дерево. Декоратор просто знает свою работу и делает это: он просто рисует линии между собой и декораторами-предками.

...