WPF. Как остановить анимацию триггера данных посредством привязки?
В WPF toolkit datagrid у меня есть триггер данных, связанный с непрозрачностью элемента ячейки.
Когда UpVisibility
изменяется на 1, путь становится видимым, и анимация начинает исчезать до 0. Что работает.
Однако моя проблема сейчас - если мне нужно преждевременно остановить/отменить затухание и установить UpVisibility
на 0, путь все еще будет видимым и затухающим, поскольку ничего не произошло....
Как быстро удалить непрозрачность в 0 с помощью объекта MyValue?
<Path Data="M 5,0 0,10 10,10" Height="10" Width="10" Fill="Green" Opacity="{Binding MyValue[0].UpVisibility}" Margin="5,0,5,0">
<Path.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding MyValue[0].UpVisibility}" Value="1.0">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:10" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Path.Style>
</Path>
Ответы
Ответ 1
Вы пробовали что-то вроде этого (непроверенный пример):
<Path Data="M 5,0 0,10 10,10" Height="10" Width="10" Fill="Green" Opacity="{Binding MyValue[0].UpVisibility}" Margin="5,0,5,0">
<Path.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding MyValue[0].UpVisibility}" Value="1.0">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:10" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="0.0" Duration="0:0:0" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Path.Style>
</Path>
Я установил продолжительность анимации равным 0. И если вы не определяете свойство From, вы поручаете WPF начать с текущего значения DependencyProperty, поэтому он будет плавно переходить.
Ответ 2
Кадры можно также остановить с помощью ExitAction
в DataTrigger
, который вызывается, когда значение границы изменяется из целевого состояния. Просто укажите свое имя BeginStoryboard
и укажите его в действии StopStoryboard
, например:
<DataTrigger.EnterActions>
<BeginStoryboard Name="your_storyboard_name">
...
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="your_storyboard_name" />
</DataTrigger.ExitActions>
Это может быть более подходящим, чем запуск второй раскадровки, чтобы остановить или замаскировать другую раскадровку.
Ответ 3
Если вам нужна reset анимация в коде позади, вы обычно делаете такой вызов:
MyControl.BeginAnimation(OpacityProperty, null);
Но как это сделать в XAML в соответствии с MVVM? Ответ:
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding Vanishing}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard TargetProperty="Opacity">
<DoubleAnimation To="0" Duration="0:0:0.5" FillBehavior="Stop"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard TargetProperty="Opacity">
<DoubleAnimation To="{x:Null}" Duration="0:0:0"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
Чтобы вызвать анимацию в ViewModel, мы можем сделать:
Vanishing = true;
await Task.Delay(500);
Vanishing = false;
Также убедитесь, что свойство binding (Vanishing in my case) вызывает INotifyPropertyChanged, чтобы уведомить представление о новом значении