0

我希望能够显示网络树信息(存储在分层数据结构中),如下面的示例所示:

在此处输入图像描述

在图中,我有许多主机(顶级节点)——其中一个被认为是“主节点”,因此呈现方式与其他顶级节点不同。每个节点可以有多个子节点(探针)。节点之间的线显示连接,如果任何连接断开,则线会更改,如 Hostname2 和 Probe2.3 之间所示。选择的任何节点(主机或探测器)也应该以不同的方式呈现。

我正在使用 Prism/MVVM 并且我试图保持代码尽可能干净,但我不确定显示这些数据的最佳方式。

我考虑过使用 TreeView,但我想不出一种干净的方式来创建节点之间的链接。我也考虑过创建一个自定义面板,但我不确定这是最合适的,也不知道从哪里开始。然后我想创建一个自定义 ItemsControl,因为使用 DataTemplate 和 HierarchicalDataTemplate 会很好。我还可以创建一个包含画布的 UserControl 并在其中的代码隐藏中执行所有操作,但感觉不是最好的方法。

如果您有意见、示例代码、链接或任何建议,我将不胜感激。

4

1 回答 1

0

你很幸运,去年我不得不为我现在的工作写一些非常相似的东西。我不能给你我的任何代码,但我可以引导你朝着正确的方向前进。

我在这里找到了一个有向图集合类:http: //msdn.microsoft.com/en-us/library/ms379574 (v=vs.80).aspx#datastructures20_5_topic3 。

我还使用了在 MSDN 上找到的径向面板:http: //msdn.microsoft.com/en-us/library/ms771363 (v=VS.90).aspx 。这允许多个节点以几何形状绘制。所以如果你有 3 个节点,他们画一个三角形,4 个正方形,5 个五边形,等等……你拥有的节点越多,布局就越变成圆形。这对您不起作用,但如果您点击链接,它将向您展示如何创建具有自定义布局的自定义面板。这可能是有益的。

然后我使用 Canvas 作为舞台,使用 RadialPanel 作为 Canvas 的子元素。每个节点只是一个添加到 RadialPanel 的带有椭圆背景的 WPF UserControl。然后有向图集合成为节点视图模型的集合。我存储节点连接的位置,几乎就像一个链表。这使我可以轻松地遍历我的图形集合,而无需遍历每个节点来查找我正在寻找的节点。

绘图中有一些技巧可以确保布局正确,尤其是在绘制连接线时。请参阅我发表的这篇 StackOverflow 帖子: WPF 和 C# - GeneralTransform 和 UIElement.TransformToVisual 的问题。它有一个指向我的节点图图像的链接,因此您可以比较我们的图。

这显然不是全部,但我认为这是一个好的开始。对我来说,我无法真正覆盖任何当前的控件来完全满足我的需要,所以我走上了艰难的道路。权衡是代码隐藏和视图模型中的大量工作,但我也控制它的绘制方式的主要方面。我这有帮助。

于 2011-12-01T14:21:04.567 回答