Hoy, haciendo algunas pruebas para el trabajo, tuve la necesidad de detectar sólo cuando el usuario está -activamente- presionando un botón. Es decir, no el evento click/tap ni un hold, sólo cuando tiene el click/dedo encima del botón mientras lo mantiene presionado. Esto se corresponde con los eventos PointerPressed y PointerReleased de los elementos visuales.
El problema, en Windows 8, está en que estos eventos no se disparan correctamente en un botón, directamente no se disparan. Algo disparatado, realmente, teniendo en cuenta que es un elemento visual que está hecho específicamente para ser presionado. Sea como fuere, puede haber dos soluciones:
- Si necesitas varios botones pulsados a la vez entonces, la solución no es usar un botón, sino un Grid, como bien me sugirió Adrián Fernández.
- Si sólo necesitas un botón a la vez, la solución pasa por hacerlo de una manera más rústica que sólo suscribiéndose al PointerPressed y PointerReleased, con el siguiente código:
BotonQueNecesites.AddHandler(PointerPressedEvent, new PointerEventHandler(BotonQueNecesites_PointerPressed), true);
Recuerda que puedes usar Ctrl+. sobre BotonQueNecesites_PointerPressed para poder crear el método con los argumentos correctos, sin necesidad de sabértelos de memoria. Así pues, el caso contrario par el PointerReleased resulta análogo:
BotonQueNecesites.AddHandler(PointerReleasedEvent, new PointerEventHandler(BotonQueNecesites_PointerReleased), true);
A partir de esto, sólo queda definir los handlers:
private void BotonQueNecesites_PointerReleased(object sender, PointerRoutedEventArgs e) { output.Text = "Released"; } private void BotonQueNecesites_PointerPressed(object sender, PointerRoutedEventArgs e) { output.Text = "Pressed"; }
La entrada Cómo hacer que PointerPressed y PointerReleased funcionen en un botón de Windows 8 con C# aparece primero en Daniel Rozo.