WPF和C#-GeneralTransform和UIElement.TransformToVisual的问题 [英] WPF and C# - Issue with GeneralTransform and UIElement.TransformToVisual

查看:24
本文介绍了WPF和C#-GeneralTransform和UIElement.TransformToVisual的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用WPF只有几个月,但我有丰富的WinForm、ASP.NET和Flex背景。我正在尝试绘制如下所示的用户控件IMAGE

我们正在使用MVVM模式。当用户控件第一次加载时,一切都会正确绘制。该控件由一块画布组成。在画布中存在一个放射状面板,它将几何地放置已添加的UIElement。圆形节点被绘制到放射状嵌板中。显示的多段线在画布中绘制。我通过使用GeneralTransform和调用UIElement.TransformToVisual来获得折线的终点。其中,调用中的UIElement是放射状面板中的蓝色节点,它与放射状面板一起变换。第一次加载控件时,所有内容都正确绘制。失败的地方是MVVM模式通知绘图有更新。

当我尝试根据系统更新进行刷新时,我已经确认我的所有集合都包含正确的数据。因此,MVVM模式正在发挥其应有的作用。然而,当我尝试绘制直线时,我对TransformToVisual的调用返回的是0,0点,而不是它在加载过程中返回的值。这会导致我的折线绘制在控件的左上角,而不是连接两个节点。

以下是操作顺序:

1)User Control Load将生成用于绘制控件的集合。这些集合是在用户控件的本地构建的,数据来自驻留在视图模型中的主信息集合。用户控件将其自身的刷新方法注册到UI刷新广播消息。

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

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

4)从OnRender调用连线动作。在其中,我使用了GeneralTransform gt=node.TransformToVisual(RadialPanel)。当"刷新"用户控件时,此调用始终返回0,0,但始终对该控件执行第一次加载。

我非常肯定问题出在我如何根据网络通知刷新用户控件。我试图清除控制,然后重新执行相同的加载操作,但仍然没有成功。我已经对用户控件执行了InvalidateVisual,并尝试在我重写的OnRender中执行所有操作,但仍然没有成功;仍然返回0,0。

有没有人知道General Transform会发生什么?我走进了死胡同,任何新的途径都会有所帮助。

推荐答案

我想出来了。所以我把答案贴出来,以防其他人处理这个问题。

问题是,在尝试绘制线条之前,我没有强制对放射状面板进行测量覆盖和阵列覆盖。如果不调用这两个节点,则在我连接线路时,节点位于位置0,0。通过强制它们在绘制线条之前调用,TransformToVisual可以正常工作。

这篇关于WPF和C#-GeneralTransform和UIElement.TransformToVisual的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆