我需要开发一个WPF自定义控件来显示无线网状网络中节点的布局和连接。用户需要能够拖动节点。如果元素从可用空间中消失,则画布应该增长并且Scrollbars应该按需要显示。可能需要放大/缩小的能力。
我的第一个想法是使用ListBox派生的CustomControl和基于Canvas的ItemsPanelTemplate。为了让事情发生,我使用Josh Smiths DragCanvas,允许UIElements画布的孩子被拖动。我的“node”类当前不是UIElement派生的(DragCanvas当前正在使用包装我的节点的ListBoxItems。)
的 1。这是一种明智的方法,还是应该遵循ListBox的想法并进入较低级别?
2.我必须覆盖节点间链接线 - 目前还不确定如何解决此问题(作为属于ControlTemplate的UIElement类?)
有些人似乎对画布中的滚动条很头疼 - 这是一个问题吗?
最感谢的任何一般或具体建议。
答案 0 :(得分:1)
我正在做类似的事情,但事情并非如此简单。
1)恕我直言,DragCanvas是主持+拖动元素的基本方式。由于你必须再次托管标签(节点),弧线和标签(弧线的重量),我认为DragCanvas比自己编写自定义控件更难。
通过模板化并不是一切都变得容易:有时候,“旧”方法更像winforms,甚至是混合方式。
2)如上所述,我将创建一个Canvas派生的面板,它将托管几个UIElements(标签,弧等)。所有这些都应该由model + viewmodel管理。这在开始时有点困难,但它将在未来给你很多满足感和灵活性。
3)我不认为Canvas会让你头疼!装满元素的画布总是大小为零。对于那些试图添加滚动查看器的人来说,这会带来“头痛”。
相反,Canvas派生类(上面)应该覆盖MeasureOverride方法,以便它的大小适合任何托管对象。但是,有些烦人的事实是你不能使用负坐标(它会导致滚动问题)。
很难用几行来描述类似“编辑”背后的所有工作。任务并不容易,问题很多。
无论如何,希望它有所帮助。
干杯