2012-05-29 13 views
11

Estoy tratando de implementar un control personalizado que consiste en una cuadrícula con algunos elementos de lienzo como elementos secundarios. Cuando se realiza una acción de deslizamiento en la cuadrícula, pretendo realizar alguna operación con el lienzo elementos. Soy incapaz de manejar el golpe para la red, que han publicado la misma en el msdn - win8 Dev forumManejo Swipe Guesture en Windows 8 Grid

+0

Intenté manejar el puntero movido, ingresé delegados para imitar el deslizamiento, pero no puedo diferenciar el gesto Derecha -> Izquierda e Izquierda -> Derecha. No estoy consciente de configurar el objeto GestureRecoginizer para una grilla. –

Respuesta

24

Estaba en el mismo barco que ustedes, ya que no había muestras de cómo se hacía esto, pero después de examinar minuciosamente la documentación de MSDN sobre cómo se implementa un gesto de deslizamiento en una aplicación de Windows 8 Store usando C# , esto es lo que se me ocurrió (y funciona para mi aplicación que requiere deslizar arriba/abajo/izquierda/derecha):

En primer lugar, en lugar de GestureRecognizer, los eventos de Manipulación deben ser utilizados, etc. la cuadrícula que desea controlar (digamos que la hace de modo que ocupe toda la pantalla para que interprete los gestos) haga lo siguiente:

Llamé a mi cuadrícula deslizando urface y yo estoy manejando modos de manipulación, tanto para el eje Y y el eje X:

swipingSurface.ManipulationMode = ManipulationModes.TranslateX | ManipulationModes.TranslateY; 

Entonces cablear los eventos de manipulación que desea ser notificado, en mi caso sólo quiero saber entonces el la manipulación y comenzó cuando terminó:

swipingSurface.ManipulationStarted += OnManipulationStarted; 
swipingSurface.ManipulationCompleted += OnManipulationCompleted; 

Haz lo que quiere en su manipulación comenzó, tales como conseguir el punto inicial si lo desea. Pero el truco real es en el caso ManipulationCompleted, en el que se necesita para obtener las velocidades resultantes de su gesto, de la siguiente manera:

public void OnManipulationCompleted(object sender, ManipulationCompletedEventArgs e) { 
    var velocities = e.Velocities;  
} 

El ManipulationCompletedEventArgs Velocidades propiedad traerá de vuelta una estructura de tipo ManipulationVelocities, que contiene otras propiedades dentro:

- Angular: La velocidad de rotación en grados por milisegundo.

- Expansión: La velocidad de expansión, o escala, en DIP por milisegundo.

- Linear: La velocidad en línea recta en DIP por milisegundo.

realidad estoy mirando a la Linear velocidad, que es un puntoque contiene valores de X e Y indican la dirección en la que se realizó el gesto; por ejemplo, si el deslizamiento fue hacia arriba, notará que el valor Y es positivo, y si está abajo, el valor Y es negativo; lo mismo aplica para el valor X, si el deslizamiento queda, los valores X son negativos y si el deslizamiento es correcto, los valores X son positivos, por lo que puede jugar con esos valores y verificar su dirección de deslizamiento, puntos finales, etc.

Espero que esto ayude.

+0

Bueno, la parte del deslizamiento se resuelve gracias a usted. Pero ahora necesito resolver un problema (no sé si también lo resolvió). El deslizamiento no funciona en un espacio en blanco (imagine que tiene una cuadrícula, con celdas vacías ... no puede deslizar sobre esas celdas incluso si capta esos eventos en la cuadrícula o en la matriz) –

+0

@Tiago Almeida ¿Estás recibiendo todos los eventos cuando la grilla está vacía? –

+2

@RajmohanKathiresan Eventualmente lo he resuelto. Resulta que debes tener un fondo para poder recibir eventos. Incluso si ese fondo está configurado en Transparente. –

1

Usted podría intentar establecer ManipulationMode de su mando a golpe-poder y gastos de la manipulación ~ eventos. Tenga en cuenta que algunos controles pueden dejar de burbujear los eventos de la interfaz de usuario, por lo que si usted dice poner su control dentro de un botón o un ScrollViewer, los eventos podrían no funcionar.

+1

Gracias, voy a intentar con eso, ¿pueden guiarme para asignar un gesto para una grilla? 'geustureRecorgizer = new GestureRecognizer(); geustureRecorgizer.CrossSlideHorizontally = true; geustureRecorgizer.GestureSettings = GestureSettings.CrossSlide; geustureRecorgizer.CrossSliding + = new TypedEventHandler (Guesture_Sliding); ' Cómo asignar este gesto a la red –

+0

Lo sentimos, no he utilizado GestureRecognizer todavía. –

1

Puede consultar SwipeHintThemeAnimation que usa GestureRecognizer para conectar a un control de rectángulo o modificarlo para usar su control de cuadrícula, consulte the documentation.