mikeo_410


 TreeViewのノード

  TreeView のヘルプの例は、TreeViewItem をノードにしています。独自のデータが必要な場合は、TreeViewItem を継承すれば良さそうです。

1.ノードの列として処理するために

  同じ型のノードの連鎖としてプログラミングするために。

1.1.TreeView と ノード

  開始は、TreeView ですが、TreeView 自体は、ヘッダを持たないので、表示上のルートにはなりません。表示されるのは、TreeView.Items[]に格納したノードになります。

1.2.ルートがあるか(最上位の展開表示)

  ルートがあり、たたむと1つになるようにするには、TreeView.Items[0]にだけ、ノードを設定することになります。
  この場合は、TreeView.Items[0]以下を処理するようにすれば、全てのノードが同じ型で扱えます。

  ルートがない表示は、TreeView.Items[]のCountが >1 のことです。
  この場合、TreeView.Items[]は、展開して表示され、たたむことはできません。

  ノードの展開表示は、TreeViewItem.IsExpanded で行いますが、TreeViewには IsExpanded はなく、最上位は TreeView.Items[] への格納状態によると言うことです。

1.3.Items の型

  ノードをたどるには、Parent と Items[] を使います。
  TreeView.Items と TreeViewItem.Items は、共に ItemCollection型 です。
  TreeViewのItems以降は、区別なく扱えます。

1.4.ItemControl

  TreeView も TreeViewItem も ItemControl を継承し、Items はここから来ています。
  TreeView と ノードは、ItemControl にキャストすれば、同様に扱えます。

2.IreeViewItem はコントロール

  IreeViewItem は、単にツリー構造を表すコレクションではなく、コントロール(UIElement)です。

2.1.IreeViewItem の主要なプロパティ

  Headerにノードを表す表示文字列などを設定します。
  Parent と Items[] が、ツリー構造を表しています。
  IsExpanded で、展開表示の状態を制御できます。

2.2.Header

  Headerに、文字列を代入すれば、ノードを表すものとして TreeView に表示されます。
  TextBlock を使えば、文字を斜体にするなど文字属性を扱えます。
  Headerは、Image などの UIElement が設定できます。

2.3.OnExpanded() のオーバライド

  注目するノードを展開表示するには、その親も展開する必要がありますが、自動的には展開してくれないようです。プログラムから開くには、OnExpanded() で、Parent の IsExpanded を設定すれば良さそうです。

2.4.マウスイベント処理のオーバライド

  ノードのドラッグドロップでの移動は、自動的にはしてくれないようです。マウス関連のイベントをオーバライドして実現出来ました。

2.5.スタティックな変数の利用

  当然ノードのインスタンスは、TreeViewのノードの数だけ出来ますが、最後に開いていたノードやドラッグドロップのターゲットなど、ノード全体を通じて一義の情報があります。
  この目的にスタティックな変数を使うことが出来ます。

2.6.イベントのソース

  表示されているノードを表す文字列をダブルクリックしたら、そのノードに関する処理をするわけですが、このイベントのソースが何かが良くわかりません。
  文字列をHeaderに設定した場合は、問題なくノードを Sender引数にセットして通知されます。
  TextBlockをHeaderに設定したら、TextBlockが通知されました。

  1. public class Node : TreeViewItem
  2. {
  3.     //--------------------------------------------------------------------
  4.     //各ノード固有のデータ
  5.     public readonly long id;
  6.     public string url;
  7.     public int level;
  8.     public int published;
  9.     public long content_id;
  10.     public event EventHandler DoubleClick;//目次編集時のダブルクリックイベント
  11.     //--------------------------------------------------------------------
  12.     //スタティック変数。全ノードで同じ値になる。
  13.     static Cursor NodeOnCursor = Cursors.Arrow;//OnQueryCursor()で応答するカーソル形状
  14.     //--------------------------------------------------------------------
  15.     //コンストラクタ

足立区 不動産 足立区 新築一戸建 田園都市線 不動産 遺産相続 手続 相続税 計算