【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

TreeViewのダブルクリック

n7shi2009-07-25


Silverlight 3でTreeViewがサポートされました。デフォルトでは参照されないため、System.Windows.Controls.dllを参照に追加する必要があります。

ItemsにはTreeViewItem以外も入れられますが、子ノードをぶら下げられるのはTreeViewItemだけです。以下は親ノードTreeViewItemに子ノードintをぶら下げる例です。

var treeView1 = new TreeView();
var root = new TreeViewItem { Header = "root" };
for (int i = 1; i <= 5; i++) root.Items.Add(i);
treeView1.Items.Add(root);

以下はMouseLeftButtonUpの間隔からダブルクリックを検出して、VisualTreeHelper.FindElementsInHostCoordinates()で該当するTreeViewItemを取得する例です。 ⇒ 動作確認とソース

TreeViewItem lastClickItem = null;
var lastClickTime = DateTime.Now.AddSeconds(-1);
treeView1.MouseLeftButtonUp += (sender, e) =>
{
    var it = (from item in
                  VisualTreeHelper.FindElementsInHostCoordinates(
                      e.GetPosition(null), treeView1)
              where item is TreeViewItem
              select item as TreeViewItem).GetEnumerator();
    var now = DateTime.Now;
    if (!it.MoveNext())
        lastClickItem = null;
    else
    {
        if (it.Current == lastClickItem
            && (now - lastClickTime).TotalMilliseconds < 500)
            MessageBox.Show("double click: " + it.Current.Header);
        lastClickItem = it.Current;
    }
    lastClickTime = now;
};

intで追加したノードにも自動的にTreeViewItemが割り当てられています。