我正在尝试在WPF中编写自定义Treeview,其中子项按行与父项链接。
这很难解释,但我基本上是在尝试制作以下树视图的自定义版本,以便我们的设计师可以根据需要进行自定义:
有一种简单的方法吗?到目前为止,我一直在抨击它并且还没有走得太远。
答案 0 :(得分:3)
这是一个有趣的问题。我认为你可能需要做的就是创建一个子类TreeViewItem
的自定义控件,并添加一些父类没有提供的依赖属性。
由于TreeViewItem
继承自ItemsControl
而非Selector
,因此它不具有SelectedItem
或SelectedIndex
属性。您的自定义控件需要实现这些属性。关于这一点的棘手问题是设置SelectedItem
:它可以是IsSelected
为真的项目,也可以是Items
属性包含SelectedItem
项的项目}不是null。 SelectedIndex
属性需要以相同的方式工作。
您将需要的另一个属性 - 我不确定您如何计算 - 是要进入{{1}网格的第1行第0行的行的高度}模板。有可能将此计算为TreeViewItem
和行的SelectedIndex
的函数,这将是很好的,因为那样您就不必参与控制的任何细节。呈现。
无论如何,一旦拥有这些属性,编辑控件模板以使用它们应该很简单。扩展三角形周围有一个圆圈,只有在ActualHeight
不为空时才可见。 (实际上,它是一个圆圈,其中一条线下降到网格单元格的底部。)您有一条线从网格单元格的圆圈延伸到左边缘,如果SelectedItem
不为空,则可见{ {1}}不为空。您在网格的第1行第0列中有垂直线,只有在SelectedItem
不为空时才会显示该垂直线。
如果Parent
为真,则显示元素:膨胀器单元格中的水平线和黑色箭头背景。
我认为,实际上这并不是一项疯狂的工作,以获得如此酷的效果。
答案 1 :(得分:0)
要自定义WPF TreeView,有几件事情很重要:
Josh Smith有good article on Code Project解释了所有这些以及更多内容。
编辑:
您可以将一个完整的UserControl放在一个节点中,该节点执行UserControl可以执行的任何操作。
编辑2:
从更新的插图中,我建议为TreeView创建一个Style。 DataTemplates仅适用于树中的各个项目节点。