2010-11-13 8 views
5

Para mi aplicación, me gustaría utilizar todas las posibilidades de manipulación incorporadas, como p. Ej. enfocar. Pero si el usuario presiona 3 dedos en la pantalla, me gustaría mostrar un elemento de IU específico. Entonces, ¿cuál es la mejor manera de comprobar si el usuario ha presionado 3 dedos al mismo tiempo y uno al lado del otro en la pantalla? (sin deshabilitar las posibilidades de manipulación incorporadas).Cómo comprobar si se colocan 3 dedos en la pantalla

Mi primer enfoque fue registrar el evento TouchDown en el elemento Grid superior de mi diseño. En el controlador de eventos obtengo el contacto. ¿Pero qué hacer allí?

Simplemente compruebe si el contacto es una huella dactilar, guárdelo en una lista y compruebe si la lista ya contiene dos conacts similares.

¿O hay una solución más sexy?

Gracias!

Editar:

Después de la respuesta que escribí dos métodos:

private void OnContactDown(object sender, ContactEventArgs e) 
     { 
      if (this.ContactsOver.Count == 3) 
      { 
       Console.WriteLine("3 contacts down. Check proximity"); 

       if (areNear(this.ContactsOver)) 
       { 
        Console.WriteLine("3 fingers down!"); 
       } 
      } 
     } 

     private Boolean areNear(ReadOnlyContactCollection contacts) 
     { 
      if (Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).X - contacts.ElementAt(1).GetCenterPosition(this).X) < 100 && 
       Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).Y - contacts.ElementAt(1).GetCenterPosition(this).Y) < 100 && 
       Math.Abs(contacts.ElementAt(1).GetCenterPosition(this).X - contacts.ElementAt(2).GetCenterPosition(this).X) < 100 && 
       Math.Abs(contacts.ElementAt(1).GetCenterPosition(this).Y - contacts.ElementAt(2).GetCenterPosition(this).Y) < 100 && 
       Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).X - contacts.ElementAt(2).GetCenterPosition(this).X) < 100 && 
       Math.Abs(contacts.ElementAt(0).GetCenterPosition(this).Y - contacts.ElementAt(2).GetCenterPosition(this).Y) < 100) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

Tienen que ser reescrito, pero funciona. Y el umbral (atm 100) tiene que ajustarse.

+1

Sea cuidadoso al almacenar 'contactos' en su propia lista. Cualquier llamada al 'contacto' o uso de campos generará una excepción una vez que el dedo que causó el 'contacto 'ya no esté abajo. – Donnie

Respuesta

2

Hay una propiedad en todos los controles de superficie que contiene el número de contactos que la contiene. La propiedad es ContactsOver o cualquier variante de la misma dependiendo de su necesidad, consulte http://msdn.microsoft.com/en-us/library/microsoft.surface.presentation.controls.surfacecontrol_properties(v=Surface.10).aspx

Puede verificar el valor de County properys en su controlador de eventos ContactDown, por ejemplo. Para verificar su distancia, simplemente haga una GetPosition en ellos y use una matemática vectorial básica en los puntos.

+0

Gracias, esto parece muy útil. Lo intento esta noche y reportaré el resultado. – RoflcoptrException

+0

Escribí a métodos para verificar su solución: vea la edición – RoflcoptrException

Cuestiones relacionadas