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

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:

a cui corrispondono nel code-behind i rispettivi metodi:

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:

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!
posted @ venerdì 12 luglio 2013 23:13