2010-02-12 3 views
0

Nous utilisons les événements Controls.PreviewContactDown, PreviewContactUp et PreviewContactChanged pour capturer les éléments marqués placés, supprimés et déplacés sur la Surface, ce qui fonctionne très bien dans l'application Simulator fournie avec la surface.Ajout d'un délai aux événements OnContactDown pour les contrôles Surface

Sur une surface réelle, si vous avez déplacé un élément balisé trop rapidement, les caméras perdent le focus de la balise, supposent qu'elle a été retirée, puis la capture à nouveau lorsqu'elle s'arrête de bouger. Cela fournit une expérience assez pauvre pour nos clients. Ce que je propose est un moyen de surcharger ou de créer un nouvel événement qui répondrait aux événements d'éléments marqués, mais ne déclencherait pas le gestionnaire d'événements avant un délai ... ie si "ContactUp" est déclenché, attendez 100ms et ALORS exécuter le gestionnaire d'événements. Idéalement, nous aimerions simplement être en mesure d'utiliser une propriété autre attaché à définir ces gestionnaires d'événements, à savoir

<Panel local:TagDown="TagDownEventHandler" /> 

Et si nous pouvions obtenir d'utiliser des objets ICommand au lieu des gestionnaires d'événements qui seraient encore mieux.

Répondre

2

Pourquoi ne pas utiliser le TagVisualizer? Ceci gère déjà le tag lost/found en vous donnant une animation de fondu par défaut avant que le visuel ne soit retiré de l'écran.

Il est plus difficile de faire la même chose avec les doigts car une fois le contact perdu, il n'y a plus de connexion entre le contact d'origine et le nouveau.

+0

TagVisualizer ne fonctionnera pas aussi facilement parce que nous ne savons pas précisément ce que les étiquettes que nous travaillons avec, et je suis sûr TagVisualizer vous devez spécifier quelles valeurs balise pour écouter - le client pourrait utiliser n'importe quel sous-ensemble des étiquettes 00-FF. Dans le même temps, le TagVisualizer pourrait effectivement souffrir du même problème - ce qui se passe sur notre unité de surface Dev est si vous "traînez" un objet marqué sur la surface à une vitesse décente, il laisse tomber le suivi de cet objet - I pense que c'est plus une limitation matérielle des caméras internes qu'autre chose. – RTigger

+0

Si vous ne savez pas quelle étiquette, alors que diriez-vous simplement tout (vous pouvez le faire aussi par programmation)? Problème résolu. Oui, la chute des contacts est un problème fondamental ... mais comme je l'ai dit, la TV contourne le problème car elle n'élimine pas immédiatement les visuels, donc si elle perd son contact en bougeant, elle recule doucement une fois qu'elle a été redétectée. – Schneider

1

Nous avons trouvé la même chose avec les événements réels de surface et de contact. Ce que nous avons fait (et cela dépendra de vos besoins) est de créer une classe de base pour un "conteneur de contact", qui a sa propre méthode de gestion de ContactUp où nous déclenchons un timer avec un ensemble d'eventArgs qui contiennent l'objet/tag en cours de suppression et l'ajouter à une liste. Si la minuterie cochée, alors nous enlevons l'objet/étiquette du conteneur et la liste en file d'attente. Lorsque le contactDown se déclenche, nous confirmons qu'il n'y a aucun objet correspondant dans la file d'attente, si nous arrêtons le temporisateur et le retirons de la file d'attente et ignorons le nouveau tag, car il est déjà dans le conteneur. Si ce n'est pas le cas, nous traitons le nouveau tag placé.

Nous sommes encore en train de peaufiner le code pour assurer sa robustesse, une fois que c'est possible, je posterai la solution sur Codeplex.

HTH

Questions connexes