自定义WPF Treeview

时间:2010-12-29 10:55:39

标签: wpf treeview

我正在尝试在WPF中编写自定义Treeview,其中子项按行与父项链接。

这很难解释,但我基本上是在尝试制作以下树视图的自定义版本,以便我们的设计师可以根据需要进行自定义:

Requirement

有一种简单的方法吗?到目前为止,我一直在抨击它并且还没有走得太远。

2 个答案:

答案 0 :(得分:3)

这是一个有趣的问题。我认为你可能需要做的就是创建一个子类TreeViewItem的自定义控件,并添加一些父类没有提供的依赖属性。

由于TreeViewItem继承自ItemsControl而非Selector,因此它不具有SelectedItemSelectedIndex属性。您的自定义控件需要实现这些属性。关于这一点的棘手问题是设置SelectedItem:它可以是IsSelected为真的项目,也可以是Items属性包含SelectedItem项的项目}不是null。 SelectedIndex属性需要以相同的方式工作。

您将需要的另一个属性 - 我不确定您如何计算 - 是要进入{{1}网格的第1行第0行的行的高度}模板。有可能将此计算为TreeViewItem和行的SelectedIndex的函数,这将是很好的,因为那样您就不必参与控制的任何细节。呈现。

无论如何,一旦拥有这些属性,编辑控件模板以使用它们应该很简单。扩展三角形周围有一个圆圈,只有在ActualHeight不为空时才可见。 (实际上,它是一个圆圈,其中一条线下降到网格单元格的底部。)您有一条线从网格单元格的圆圈延伸到左边缘,如果SelectedItem不为空,则可见{ {1}}不为空。您在网格的第1行第0列中有垂直线,只有在SelectedItem不为空时才会显示该垂直线。

如果Parent为真,则显示元素:膨胀器单元格中的水平线和黑色箭头背景。

我认为,实际上这并不是一项疯狂的工作,以获得如此酷的效果。

答案 1 :(得分:0)

要自定义WPF TreeView,有几件事情很重要:

  1. 使用数据绑定将TreeView的节点绑定到节点的ViewModel对象
  2. 使DataTemplates与ViewModel节点的类型匹配
  3. Josh Smith有good article on Code Project解释了所有这些以及更多内容。

    编辑:

    您可以将一个完整的UserControl放在一个节点中,该节点执行UserControl可以执行的任何操作。

    编辑2:

    从更新的插图中,我建议为TreeView创建一个Style。 DataTemplates仅适用于树中的各个项目节点。