Двойная анимация WPF установлена ​​неверно - PullRequest
1 голос
/ 19 декабря 2010

У меня есть простой код для анимации движения на холсте. Проблема в том, что после завершения анимации элемент не имеет правильного значения.

Вот пример:

<Canvas Name="_canvas" >
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Name="button1" VerticalAlignment="Top" Width="292"  Canvas.Left="56" Canvas.Top="26">
    <Button.Triggers>
            <EventTrigger RoutedEvent="ButtonBase.Click">
                <BeginStoryboard>
                    <Storyboard Completed="Timeline_OnCompleted">
                        <DoubleAnimation Duration="0:0:1" To="264" Storyboard.TargetProperty="(Canvas.Top)"/>                       
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>       
</Canvas>

И в коде позади

private void Timeline_OnCompleted(object sender, EventArgs e)
{
    button1.Content = "Top is " + Canvas.GetTop(button1) + "and should be 264";
}

Результат после завершения анимации

example

Ответы [ 2 ]

2 голосов
/ 19 декабря 2010

Это подтвержденная ошибка в WPF: Событие Completed раскадровки срабатывает до того, как завершены временные шкалы (см. Соединение ).

Если вместо этого вы обрабатываете событие Completed в DoubleAnimation, оно покажет правильное конечное значение.

0 голосов
/ 19 декабря 2010

Похоже, что OnCompleted вызывается до того, как будет выполнен последний шаг анимации. Если вам действительно нужно прочитать верхнюю позицию кнопки (т.е. получение DoubleAnimation.To недопустимо), попробуйте запустить Canvas.GetTop(button1), когда приложение будет бездействовать (или попробуйте другие приоритеты диспетчера).

Dispatcher.BeginInvoke(
    (Action)(
        () => button1.Content = "Top is " + Canvas.GetTop(button1) + "and should be 264"
    ),
    DispatcherPriority.ApplicationIdle
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...