Я смог использовать эту технику, чтобы сделать то, что я хотел, то есть предотвратить обратную навигацию, скрывая элемент управления, который скользит в окно и из окна. По умолчанию видимость элемента управления свернута. Раскадровки используются для контроля, когда он становится видимым или свернутым. В XAML внутри раскадровки:
<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>
Тогда в коде страницы:
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;
}
}
Примечание. В раскадровке, которая скрывает ContentScroller (который является сеткой), KeyTime установлен на «00:00:01», потому что я хочу, чтобы он оставался видимым, пока он скользит (и исчезает) из поля зрения.
Примечание 2: Причина, по которой StoryboardHideControlSlider.GetCurrentState() != ClockState.Active
включена в оператор if, заключается в том, что если пользователь дважды нажимает кнопку «Назад», а раскадровка не завершена, он запускается снова. Это предотвращает возврат кнопки назад на предыдущую страницу. Другими словами, если раскадровка активна, код «знает», что пользователь уже инициировал ее скрытие, и намеревается вернуться на предыдущую страницу. (Ну, по крайней мере, такое поведение они получат ... и они не увидят анимацию дважды)!