2011-09-16 28 views
1

我需要开发一个WPF自定义控件来显示无线网状网络中节点的布局和连接。用户需要能够拖动节点。如果元素从可用空间中拖出,画布应该长大并且滚动条应该按需要显示。可能需要放大/缩小功能。 我的第一件事就是使用ListBox派生的CustomControl和基于Canvas的ItemsPanelTemplate。为了让事情进展我使用Josh Smiths DragCanvas允许拖动画布的UIElements子元素。我的“节点”类目前不是UIElement派生的(DragCanvas目前正在处理包裹我节点的ListBoxItems)。
1.这是一个有理有据的方法,还是我应该放弃ListBox的想法并进行更低级别的操作?
2.我必须覆盖节点间的链接线 - 目前还不确定如何去解决这个问题(作为ControlTemplate一部分的UIElement类)
3.有些人似乎很头疼Canvases中的滚动条 - 这会成为一个问题吗?
任何一般或具体的建议最受赞赏。 Basic target look of final controlWPF CustomControl设计建议

回答

1

哇,作为一个控制不坏!

我正在做类似的事情,但并不那么简单。

1)恕我直言,DragCanvas是托管+拖动元素的基本方式。由于你将不得不再次托管标签(节点),弧线和标签(弧线的重量),我认为DragCanvas比自己编写自定义控件更困难。

并非所有事情都可以通过模板化来实现:有时候要比“旧”的方式更像winforms,甚至是混合的方式。 2)如前所述,我会创建一个Canvas派生面板,它将托管多个UIElements(标签,弧等)。所有这些应该由model + viewmodel来管理。这一开始有点困难,但它会在未来给你很多满意和灵活性。

3)我不认为帆布会给你任何头痛!一个充满元素的画布一直是零的大小。这导致那些试图添加滚动查看器的人“头疼”。

相反,Canvas派生类(上面)应该重写MeasureOverride方法,以便其大小适合任何托管对象。但是,你不能使用负坐标(这会导致滚动问题),这有点烦人。

很难用几行描述类似“编辑器”背后的所有工作。这项任务并不容易,问题很多。

希望它有帮助,无论如何。

干杯

+0

嗨马里奥 - 感谢您的意见。是的,我同意你对DragCanvas的评论。从你在2)中的意见中可以读到,这意味着你会从ListBox基础中取出并直接从Canvas派生自定义控件?一方面,我看到ListControl或ItemsControl对于选择等是有用的,但是另一方面,它们不一定适合于元素之间存在交互(弧和弧权重)的模型。 – Ricibob

+0

问题本身它是一个ItemsControl映射一组唯一的对象(例如节点),但是您应该将弧与它们的权重进行映射。由于它们不是*相同的控件,因此应该将两个或三个ItemsControl混合在一起,而且我觉得很麻烦,而不是使用自定义解决方案。 我真的很喜欢WPF及其方法,但有时候是一种矫枉过正。 –

+0

好吧我想研究直接从Canvas派生控件并管理对象(节点和弧/链接)我的自我 - 我会看看如何看看,也许看到其他人是否有任何输入。干杯。 – Ricibob