Desencadenar una acción al terminar de manipular un Slider en WinRT

Desencadenar una acción al terminar de manipular un Slider en WinRT
wp_tip

¡Hola a todos! En mi primer aporte para Geeky Theory os quiero dejar un tip sobre Sliders en aplicaciones de la Tienda de Windows (WinRT).

Puede que en ocasiones, necesitemos desencadenar una serie de operaciones cuando el usuario termina de manipular un Slider en nuestra aplicación, en lugar de realizar dichas operaciones cuando el Slider cambia de valor. Cómo puede ser en el caso de que hagamos una petición HTTP, es inviable realizarla a cada cambio de valor del Slider, pues estaríamos lanzando peticiones casi continuamente con cada nuevo valor.

Por internet se encuentran soluciones un tanto rebuscadas, que hablan de heredar de Slider y escuchar los eventos del elemento Thumb interno. Otras hablan de usar un DispatcherTimer para comprobar cada cierto tiempo si el usuario ha dejado de manipular o no el control, hasta que al final ojeando la documentación he encontrado una solución mucho más simple e igual de efectiva: el evento PointerCaptureLost.

Este evento se dispara, como dice la documentación oficial, cuando el puntero que tiene capturado nuestro control pasa a otro elemento o a cualquier otra parte, lo que significa que cuando el usuario deje de tocar el slider en una interfaz touch o deje de arrastrarlo en una interfaz con ratón se disparará nuestro evento. Así, podemos suscribirnos a este evento fácilmente para nuestro propósito:

<Slider Minimum="0" Maximum="100" TickFrequency="10" PointerCaptureLost="Slider_PointerCaptureLost" />

Si queremos ser más estrictos con el patrón MVVM podemos servirnos del Behaviour SDK para enlazar dicho evento a un Command en nuestro ViewModel directamente en XAML:

<Slider Minimum="0" Maximum="100" TickFrequency="10"> <interactivity:Interaction.Behaviors> <interactivity:BehaviorCollection> <core:EventTriggerBehavior EventName="PointerCaptureLost"> <core:InvokeCommandAction Command="{Binding MakeCalculationCommand}" /> </core:EventTriggerBehavior> </interactivity:BehaviorCollection> </interactivity:Interaction.Behaviors> </Slider>

Espero que os sea útil, ¡¡un saludo!!