WPF.Как остановить анимацию запуска данных через привязку? - PullRequest
12 голосов
/ 19 апреля 2011

В сетке данных инструментария WPF у меня есть триггер данных, связанный с непрозрачностью элемента ячейки.

Когда 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>

Ответы [ 3 ]

15 голосов
/ 08 января 2015

Раскадровки также можно остановить с помощью ExitAction на DataTrigger, который вызывается, когда связанное значение выходит за пределы целевого состояния. Просто назовите ваше BeginStoryboard имя и укажите его в действии StopStoryboard, например:

<DataTrigger.EnterActions>
    <BeginStoryboard Name="your_storyboard_name">
        ...
    </BeginStoryboard>
</DataTrigger.EnterActions>

<DataTrigger.ExitActions>
    <StopStoryboard BeginStoryboardName="your_storyboard_name" />
</DataTrigger.ExitActions>

Это может быть более подходящим, чем запуск второй раскадровки, чтобы остановить или замаскировать другую раскадровку.

8 голосов
/ 19 апреля 2011

Вы пробовали что-то подобное (непроверенный пример):

<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, поэтому оно будет плавно переходить.

0 голосов
/ 26 октября 2017

Если вам нужно сбросить анимацию в коде позади, вы обычно делаете такой вызов:

 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;

Также убедитесь, что свойство привязки (в моем случае Vanishing) вызывает INotifyPropertyChanged , чтобы уведомить представление о новом значении

...