2011-03-10 219 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