Остановка раскадровки может быть выполнена в коде или xaml, в зависимости от того, откуда возникла необходимость.
Если EventTrigger перемещен за пределы кнопки, тогда мы можем пойти дальше и нацелить его на другой EventTrigger, который сообщит раскадровке остановить. Когда раскадровка остановлена таким образом, она не вернется к предыдущему значению.
Здесь я переместил Button.Click EventTrigger в окружающую StackPanel и добавил новый EventTrigger в CheckBox. Нажмите, чтобы остановить раскадровку кнопки при нажатии CheckBox. Это позволяет нам проверять и снимать флажок CheckBox, когда на него нажимают, и дает нам желаемое поведение снятия отметки с кнопки.
<StackPanel x:Name="myStackPanel">
<CheckBox x:Name="myCheckBox"
Content="My CheckBox" />
<Button Content="Click to Uncheck"
x:Name="myUncheckButton" />
<Button Content="Click to check the box in code."
Click="OnClick" />
<StackPanel.Triggers>
<EventTrigger RoutedEvent="Button.Click"
SourceName="myUncheckButton">
<EventTrigger.Actions>
<BeginStoryboard x:Name="myBeginStoryboard">
<Storyboard x:Name="myStoryboard">
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="myCheckBox"
Storyboard.TargetProperty="IsChecked">
<DiscreteBooleanKeyFrame KeyTime="00:00:00"
Value="False" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="CheckBox.Click"
SourceName="myCheckBox">
<EventTrigger.Actions>
<StopStoryboard BeginStoryboardName="myBeginStoryboard" />
</EventTrigger.Actions>
</EventTrigger>
</StackPanel.Triggers>
</StackPanel>
Чтобы остановить раскадровку в коде, нам нужно сделать что-то немного другое. Третья кнопка предоставляет метод, в котором мы остановим раскадровку и вернем свойству IsChecked значение true через код.
Мы не можем вызвать myStoryboard.Stop (), потому что мы не начали Storyboard с помощью кода, устанавливающего параметр isControllable. Вместо этого мы можем удалить раскадровку. Для этого нам нужен FrameworkElement, на котором существует раскадровка, в данном случае наша StackPanel. После того, как раскадровка удалена, мы можем снова установить свойство IsChecked, сохранив его в пользовательском интерфейсе.
private void OnClick(object sender, RoutedEventArgs e)
{
myStoryboard.Remove(myStackPanel);
myCheckBox.IsChecked = true;
}