Подтвердить что ты не робот

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>
4b9b3361

Ответ 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, чтобы уведомить представление о новом значении