我正在将 Silverlight 4 应用程序移植到 WinRT,我使用的以下碰撞检测代码如下所示(并且在 Silverlight 4 中运行良好):
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 的 Parent 为 null。我尝试将 rootVisual 直接设置为我的应用程序的 MainPage 对象,以及 Canvas 所在的 Grid ,但它没有帮助。
这种技术是否仍然适用于 WinRT/Metro,如果可以,我需要使用什么 rootVisual?如果没有,在 WinRT 中进行碰撞检测的更好方法是什么?