Les contrôles Panorama et Pivot sont des éléments différenciants et fondamentaux de l’expérience utilisateur Windows Phone 7. Leur rôle principal consiste à afficher un nombre important d’information horizontalement, et d’éventuellement permettre la sélection d’un élément. Même si ces contrôles ne sont pas conçus pour les scénarios d’entrée utilisateur complexes, par exemple de la saisie de valeur, cela peut dans certains cas s’avèrer nécessaire (voire la note à la fin du billet).

Si vous êtes déjà familier avec les contrôles Panorama/Pivot, vous aurez sans aucun doute remarqué que ces derniers ont toujours la priorité en matière de gestion des manipulations. Par exemple, placer un curseur dans une TextBox située dans un Panorama/Pivot s’avère difficile voire impossible : le contrôle hôte, plutôt que le curseur de texte, défilera à droite ou à gauche lorsque le doigt glisse horizontalement sur l’écran. Les contrôles Slider et ToggleSwitch sont d’autres exemples similaires.

image_thumb[4]

J’ai pour ces cas précis, implémenté la propriété attachée BlocksPan.IsEnabled. La définir à true sur un contrôle rend les manipulations effectuée sur ce dernier prioritaire par rapport au Panorama/Pivot dans lequel il est hébergé. Son utilisation est simple :

<controls:Panorama Title="MY APPLICATION" x:Name="panorama">

  <controls:PanoramaItem Header="First item">

    <TextBox pcExt:BlocksPan.IsEnabled="True" Text="This textbox blocks the panning"/>

Techniquement, l’idée est de rendre le Panorama/Pivot parent invisible au hit test lorsqu’une manipulation est démarrée sur le contrôle décoré par la propriété attachée. Un exemple et le code source sont disponibles dans le projet attaché.

Note: Permettre les saisies complexes au sein d’un Panorama/Pivot n’est pas une pratique recommandée car elle introduit une “ambiguité ergonomique” qui rend l’interface utilisateur moins déterministes. Cette extension a pour but d’être utilisée dans les scénarios simples pour lesquelles la création d’un niveau de navigation supplémentaire pour la saisie n’aurait pas de sens.