1

wpfのノードを接続するために点線を描画する方法を探していますTreeView。問題は、sを入力する代わりに使用していることのHierarchicalDataTemplateようです。TreeViewTreeViewItem

私はこの投稿を見つけました: 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 >

問題を解決する方法についての解決策や良いヒントはありますか?

4

2 に答える 2

1

私の意見では、最も簡単な方法は、アイテムスタイルにコードを追加することでした。

<HierarchicalDataTemplate.ItemContainerStyle>
   <Style TargetType="{x:Type TreeViewItem}">
      <!--your style-->
   </Style>
</HierarchicalDataTemplate.ItemContainerStyle>
于 2011-01-07T10:05:40.923 に答える
0

私の意見では、この種の問題を解決する最も簡単な方法は次のとおりです。

  1. ItemTemplateに含めることができるデコレータ「ConnectingLineDecorator」を実装します。
  2. 継承された添付プロパティConnectingLineDecorator.ParentDecoratorを定義します。
  3. MeasureOverrideでSetParentDecorator(Child, this)、子孫デコレータが親を見つけることができるようにします
  4. ParentDecoratorプロパティのPropetyChangedCallbackに、各デコレータをそのParentDecoratorに登録するコードを追加して、デコレータのツリーを作成します。
  5. デコレータの子孫デコレータが変更されるたびに、ディスパッチャコールバックをスケジュールして、どの子デコレータが線を表示する必要があるか、およびそれらの線の長さを再計算します。
  6. 各デコレータでAdornerを使用して、絶対的な位置の変化を検出します。デコレータがその親に対して移動する場合、同じディスパッチャコールバックをスケジュールして行を再計算します
  7. OnRenderでは、実際に最新のラインデータを使用してラインをレンダリングします(またはこれはAdornerで実行できますが、その場合はAdornerLayerが適切なレベルにあることを確認する必要があります)

このアプローチは、使用しているパネルの種類、スクロールのしくみ、さらにはツリーが実際にどのように構築されているかを気にしないため、多くのコードを必要とせず、完全に信頼できます。デコレータはその仕事を知っていて、それを実行します。それは、それ自体とその祖先のデコレータの間に線を引くだけです。

于 2010-11-12T21:19:44.837 に答える