2012-09-09 79 views
0

我移植一個Silverlight 4應用程序WinRT的,我是用看起來像這樣(和Silverlight 4中工作得很好)以下的碰撞檢測代碼:碰撞檢測中的WinRT /地鐵

private bool IsCollision(Point p) 
{ 
    var hostPoint = this.canvas.TransformToVisual(this.rootVisual).TransformPoint(p); 
    return CheckCollisionPoint(hostPoint, this.canvas); 
} 

private bool CheckCollisionPoint(Point point, UIElement subTree) 
{ 
    var hits = VisualTreeHelper.FindElementsInHostCoordinates(point, subTree); 
    return hits.Count() > 0; 
} 

然而,在我的Metro應用程序中,它根本沒有正確檢測到衝突。我認爲這可能與使用錯誤的rootVisual有關。制定出了rootVisual舊的代碼是這樣的:

private void FindRootVisual() 
{ 
    this.rootVisual = this.canvas; 
    while (this.rootVisual.Parent != null) 
    { 
     this.rootVisual = (FrameworkElement)this.rootVisual.Parent; 
    } 
} 

但在WinRT中,this.canvas具有null父。我已經嘗試將rootVisual直接設置到我的應用程序的MainPage對象中,並將其設置爲Canvas所在的網格,但它無濟於事。

這種技術是否仍然適用於WinRT/Metro,如果是這樣,我需要使用什麼rootVisual?如果不是的話,WinRT中碰撞檢測的更好方法是什麼?

回答

0

我發現了什麼問題。首先,我需要在我的MainPage中傳遞rootVisual,以便在命中測試之前正確轉換點。

其次,FindElementsInHostCoordinates似乎將subTree元素本身作爲命中,因此需要將其濾除。事實上,最好明確檢查找到的匹配是否是您正在進行碰撞測試的對象,因爲我在列表中還有另一個不想要的匹配。另外,您也可以設置IsHitTestVisible爲false的項目,你不想匹配(雖然在畫布本身做這在任何搜索結果與其中的任何內容)

private bool CheckCollisionPoint(Point point, UIElement subTree) 
{ 
    var hits = VisualTreeHelper.FindElementsInHostCoordinates(point, subTree); 
    return hits.Any(x => x != subTree); 
} 
+0

在第二部分中最明顯的問題是: Silverlight是如何工作的? – Dani

+0

不知道,但它確實工作:) –