2011-02-04 57 views
0

我只使用WPF几个月,但我有一个广泛的WinForm,ASP.NET和Flex背景。我试图画一个用户控件,看起来像下面的IMAGEWPF和C# - 问题与GeneralTransform和UIElement.TransformToVisual

我们正在使用MVVM模式。首次加载用户控件时,所有内容都可以正确绘制。该控件由一个画布组成。在画布内存在一个径向面板,它将在几何上放置添加的UIElements。圆形节点被拉入放射面板。所示的PolyLines画在画布上。我通过使用GeneralTransform和对UIElement.TransformToVisual的调用来获得PolyLine的端点。呼叫中的UIElement是放射面板中的蓝色节点,并且正在使用放射面板进行转换。第一次加载控件时,所有内容都可以正确绘制。失败的地方是MVVM模式通知绘图更新。

当我尝试基于系统更新进行刷新时,我已确认我的所有集合都包含正确的数据。所以MVVM模式的行为应该像它应该。但是,当我尝试绘制线条时,对TransformToVisual的调用将返回0,0的点,而不是它在加载过程中的值。这会导致我的多段线在控件的左上角绘制,而不是连接两个节点。

下面是操作顺序:

1)用户控制负荷将建立用于绘制控制我的收藏品。这些集合是在用户控件本地构建的,数据来自驻留在视图模型中的主集合。用户控件将自身的刷新方法注册到UI刷新广播消息。

2)用户尝试通过向导连接两个蓝色节点。连接器被保存并且刷新UI消息被广播。

3)User Control调用Refresh方法。在这里,我正在循环画布的子项并移除PolyLines。我也打电话给radialPanel.Children.Clear。然后我执行加载时构建我的集合的相同代码。然后,我使用我的用户控件来调用OnRender。然后OnRender将尝试绘制多段线来连接节点。节点始终放置在放射面板中。

4)连线动作是从OnRender调用的。在它内部,我使用GeneralTransform gt = node.TransformToVisual(radialPanel)。当用户控件“刷新”时,此调用总是返回0,0,但始终为控件的第一个加载。

我相当积极的问题在于我如何刷新基于网络通知的用户控件。我试图清除控件,然后重新执行相同的加载操作,但仍然没有运气。我对用户控件执行了InvalidateVisual,并试图在我的覆盖中执行所有操作。OnRender仍然没有运气; 0,0仍然返回。

有没有人对GeneralTransform可能发生什么有什么想法?我处于死胡同,任何新的道路都会有所帮助。

回答

0

我想通了。所以我发布了答案,以防其他人处理这个问题。

问题是我没有强制径向面板MeasureOverride和ArrangeOverride试图绘制线条之前。如果没有这两个调用,那么在我连接线路时,节点位于0,0位置。通过强制他们在绘制线条之前调用,TransformToVisual正常工作。