变换后获取元素位置

8

我有一个UIElement,在其上执行了各种变换(缩放和移动)。

是否有一种方法可以获取UIElement在变换后的位置?我尝试使用GetValue(Canvas.TopProperty),但它的值与加载时一样。

我肯定是漏掉了一些明显的东西,但不确定是什么。(我正在使用silverlight)

3个回答

19

虽然这样做有点不直观,但是它是可行的。 它需要两个步骤。 首先,您需要使用 TransformToVisual 函数(来自 MSDN):

返回一个变换对象,该对象可用于将坐标从 UIElement 转换为指定对象。

TransformToVisual 将产生一个 GeneralTransform,该对象将执行从任何 UIElement 到任何其他 UIElement 的转换(假设它们都存在于相同的可视树中)。听起来您需要的是从 RootVisual 进行的转换。

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

transform对象现在是一个通用的变换对象,可以用它以与RootVisual相对的方式来转换任何东西,就像myUiElement被转换的一样。

下一步是使用该变换对象来转换一个点。

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

myUiElementPosition现在是经过转换的Point,应该是您要查找的UIElement的位置。使用new Point(0,0)是因为我假设您希望将位置相对于RootVisual的左上角给出。


2
尝试使用以下方法:
var offset = Application.RootVisual.TransformToVisual(myObject)
                                   .Transform(new Point(0,0));

TransformToVisual


-1

编辑:

好的,这个怎么样?

myObjectTransform.GetValue(CompositeTransform.TranslateXProperty)

并且

myObjectTransform.GetValue(CompositeTransform.TranslateYProperty)

我不太确定如何使用这个。目前,我正在使用myObjectTransform.TranslateX += 2。这样可以每帧将对象向右移动2个单位。在哪里应该使用GeneralTransform方法?谢谢 - Skoder
@Skoder,我误解了你的设置。你能试试编辑过的片段吗? - Bala R
我得到了正确的值,但该值与元素位置不同。该值仅相对于变换而非对象位置。因此,变换的位置值已更新,但我需要元素的位置值。 - Skoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接