Как остановить анимацию WPF? - PullRequest
3 голосов
/ 07 февраля 2012

Как остановить анимацию, чтобы она не выдавала событие Completed.Вот простой пример

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="248" Width="318">
    <Grid>
        <Border Width="20" Height="20" Background="Red" MouseEnter="Border_MouseEnter" MouseLeave="Border_MouseLeave" x:Name="border" />
    </Grid>
</Window>

И код поддержки:

private void Border_MouseEnter(object sender, MouseEventArgs e)
{
    var a = new DoubleAnimation { To = 0, Duration = TimeSpan.FromMilliseconds(4000) };
    a.Completed += (obj, args) => MessageBox.Show("Boom!");
    border.BeginAnimation(Border.OpacityProperty, a);
}

private void Border_MouseLeave(object sender, MouseEventArgs e)
{
    border.BeginAnimation(Border.OpacityProperty, null);
    border.Opacity = 1;
}

Если я переместу мышь, прежде чем прямоугольник станет белым, через некоторое время все равно будет отображаться всплывающее окно.Как это предотвратить?Предположим, что методы Border_MouseLeave и Border_MouseEnter не знают друг о друге (они не могут передавать друг другу переменную экземпляра анимации).

Ответы [ 2 ]

6 голосов
/ 07 февраля 2012

вы можете использовать это:

<Border Width="20" Height="20" Background="Red" x:Name="border" >
                <Border.Triggers>
                    <EventTrigger RoutedEvent="MouseEnter">
                        <BeginStoryboard Name="Ali">
                            <Storyboard>
                                <DoubleAnimation To="0" Duration="0:0:4" Completed="com" Storyboard.TargetProperty="Opacity"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <EventTrigger RoutedEvent="MouseLeave">
                        <StopStoryboard  BeginStoryboardName="Ali"/>
                    </EventTrigger>
                </Border.Triggers>
            </Border>

и:

private void com(object sender, EventArgs e)
        {
            MessageBox.Show("boom!");
        }
1 голос
/ 07 февраля 2012

Вы можете использовать свойства EnterActions и ExitActions свойства или триггера данных или, как сказал @Ali, правильно использовать раскадровку Begin и Stop.

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