2011-03-10 194 views
5

我有一个UIElement,它对它进行了各种变换(缩放和平移)。获取变换后的元素位置

有没有办法在转换后获得UIElement的位置?我试过GetValue(Canvas.TopProperty),但它不会从它被加载的内容改变。

我必须错过一些明显的东西,但不知道是什么。 (我正在使用silverlight)

回答

17

这是一个有点不直观要做到这一点,但它可以做到的。这是一个两步过程。首先,你要什么用TransformToVisual功能(from MSDN):

返回可用于从的UIElement的坐标转换为指定对象的变换对象。

TransformToVisual将产生GeneralTransform将从任何的UIElement到任何其他的UIElement(假定它们都在相同的视觉树存在)执行变换。这听起来像你想要的是从RootVisual转变。

var transform = Application.RootVisual.TransformToVisual(myUiElement); 

transform对象现在是可用于以相同的方式被myUiElement相对于RootVisual

下一步转化为变换什么是使用变换来变换点的一般转变。

var myUiElementPosition = transform.Transform(new Point(0,0)); 

myUiElementPosition现在已转换,应该是UIElement你要找的位置Point。使用new Point(0,0)是因为我假设你想要给出相对于RootVisual左上角的位置。

-1

编辑:

好的这个怎么样?

myObjectTransform.GetValue(CompositeTransform.TranslateXProperty) 

myObjectTransform.GetValue(CompositeTransform.TranslateYProperty) 
+0

我不太知道如何使用这个。此刻,我正在使用myObjectTransform.TranslateX + = 2.这会将对象移动2帧。我在哪里可以使用GeneralTransform方法?谢谢 – Skoder 2011-03-10 22:35:56

+0

@Skoder我误解了你的设置。你可以尝试编辑的代码片段吗? – 2011-03-10 22:47:35

+0

我得到正确的值,但是值与元素的位置不一样。该值仅相对于变换而不是对象的位置。所以变换的位置值被更新,但我需要元素的位置值。 – Skoder 2011-03-10 22:56:04

2

尝试使用这种方法:

var offset = Application.RootVisual.TransformToVisual(myObject) 
            .Transform(new Point(0,0)); 

TransformToVisual