WinRT XAML Slider e l’evento scomparso

Lo <Slider>, come molti sapranno, è un semplice controllo XAML assai utile per… inserire per l’appunto uno slider in una pagina XAML:

image

Per chi deve usare lo Slider in un’applicazione Windows Store, forse può essere utile sapere che nella versione Windows 8.0 gli eventi PointerPressed e PointerReleased vengono intercettati dai componenti interni del controllo e non appaiono all’esterno.

Il che significa che se da XAML sottoscriviamo tali eventi, ad esempio con il codice:

image

a cui corrispondono nel code-behind i rispettivi metodi:

image

e proviamo a far girare la nostra applicazione, purtroppo i due metodi non verranno mai eseguiti.

Questa è una cosa nota, basta cercare sul web per accorgersene.

La buona notizia è che su Windows 8.1 questo comportamento (anomalo) del componente è stato fixato, e quindi lo stesso codice di cui sopra funziona perfettamente e i metodi vengono correttamente chiamati, com’è giusto che sia.

La seconda buona notizia è che esiste un workaround per far funzionare la cosa anche con Windows 8.0, e consiste nel aggiungere l’evento direttamente da codice, utilizzando il metodo AddHandler:

image

Il perché è presto spiegato, se si guarda alla documentazione del metodo AddHandler:

void UIElement.AddHandler(RoutedEvent routedEvent, object handler, bool handledEventsToo)
“Adds a routed event handler for a specific routed event, adding the handler to the handler collection”…

e fino a qui, niente di utile, lo stesso risultato si ottiene via XAML. Ma poi proseguendo la lettura:

… “Specify handledEventsToo as true to have the provided handler be invoked for a routed event case that had already been marked as handled by another element along the event route.”

ed ecco proprio quello che fa al caso nostro. Mettendo handledEventsToo a true, il nostro metodo viene chiamato anche se internamente il componente ha già marcato l’evento come “gestito” e quindi da non comunicare a chi esternamente avesse sottoscritto l’evento.

That’s all folks, happy coding!

«luglio»
domlunmarmergiovensab
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910