2012-09-09 2 views
0

Je suis le portage d'une application Silverlight 4 à WinRT, et le code de détection de collision suivant, j'utilisais se présente comme suit (et fonctionne très bien dans Silverlight 4):détection de collision dans WinRT/Metro

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; 
} 

Cependant , dans mon application Metro, il ne détecte pas les collisions correctement. Je pense que cela pourrait être lié à l'utilisation du mauvais rootVisual. L'ancien code qui a fonctionné le RootVisual était comme ça:

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

Mais dans WinRT, this.canvas a un parent de null. J'ai essayé de placer le rootVisual directement à l'objet MainPage de mon application, et à la grille que le canevas est dedans mais cela n'aide pas.

Cette technique devrait-elle fonctionner dans WinRT/Metro, et si oui, quel rootVisual dois-je utiliser? Sinon, quelle serait la meilleure façon de détecter les collisions dans WinRT?

Répondre

0

J'ai découvert ce qui ne va pas. D'abord, je dois passer dans mon MainPage pour être le rootVisual pour qu'il transforme le point correctement avant le hit-test.

Ensuite, FindElementsInHostCoordinates semble renvoyer l'élément subTree lui-même comme un hit, donc cela doit être filtré. En fait, il est probablement préférable de vérifier explicitement que les hits trouvés sont ceux sur lesquels vous êtes en train de tester les collisions, car j'ai également eu un autre hit indésirable dans la liste. Sinon, vous pouvez définir IsHitTestVisible false sur les articles que vous ne voulez pas correspondre (bien faire sur la toile elle-même donne aucune correspondance avec tout son contenu)

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

La question évidente dans la deuxième partie est la suivante: Comment cela a-t-il fonctionné dans Silverlight? – Dani

+0

ne sais pas, mais ça a marché :) –