J'ai pu utiliser cette technique pour faire ce que je voulais, c'est-à-dire empêcher la navigation arrière tout en masquant un contrôle qui entre et sort de la fenêtre. Par défaut, la visibilité du contrôle est réduite. Les Storyboards sont utilisés pour contrôler quand il devient visible ou réduit. Dans XAML, à l'intérieur du Storyboard :
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ControlScroller" Storyboard.TargetProperty="(UIElement.Visibility)">
<ObjectAnimationUsingKeyFrames.KeyFrames>
<DiscreteObjectKeyFrame KeyTime="00:00:00">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames.KeyFrames>
Puis dans le code de la page :
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
if(ControlScroller.Visibility == Visibility.Visible && StoryboardHideControlSlider.GetCurrentState() != ClockState.Active)
{
StoryboardHideControlSlider.Begin();
ContentGrid.IsHitTestVisible = true;
e.Cancel = true;
}
}
Remarque : dans le Storyboard qui cache le ContentScroller (qui est une grille), le KeyTime est défini sur "00:00:01" car je veux qu'il reste visible pendant qu'il glisse (et s'estompe) hors de vue.
Note 2 : La raison StoryboardHideControlSlider.GetCurrentState() != ClockState.Active
est inclus dans l'instruction if parce que si l'utilisateur appuie deux fois sur le bouton retour et que le Storyboard n'est pas terminé, il s'exécutera à nouveau. Cela empêche le bouton retour d'annuler la navigation vers la page précédente. En d'autres termes, si le Storyboard est actif, le code "sait" que l'utilisateur a déjà commencé à le masquer et qu'il a l'intention de retourner à la page précédente. (Au moins, c'est le comportement qu'il obtiendra... et il ne verra pas l'animation deux fois) !