[WPF]Анимация не выдаёт событие Completed
От: Ilya81  
Дата: 11.08.11 14:50
Оценка:
Нужно сделать компонет вроде NumericUpDown в WPF, но где б ещё при изменении цифр они б не просто менялись, а первая цифра б поднималась за пределы компонента, а нижняя — поднималась снизу. С анимацией раньше дело не имел, но написал такое

<Storyboard x:Key="BeforeChangeStoryboard" Duration="0:0:0.3">
                <DoubleAnimationUsingKeyFrames BeginTime="0:0:0" Duration="0:0:0.3" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="grid1">
                    <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="-20"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
            <Storyboard x:Key="AfterChangeStoryboard" Duration="0:0:0.3">
                <DoubleAnimationUsingKeyFrames BeginTime="0:0:0" Duration="0:0:0.3" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="grid1">
                    <EasingDoubleKeyFrame KeyTime="0:0:0" Value="20"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>


Первая часть вызывается из свойства

        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(decimal), typeof(NumericUpDown), new UIPropertyMetadata(0m, (_d, _e) =>
            {
                if ((decimal)_e.NewValue != (decimal)_e.OldValue)
                {
                    decimal newValue = (decimal)_e.NewValue;
                    NumericUpDown thisControl = _d as NumericUpDown;
                    if (newValue >= thisControl.MinValue && newValue <= thisControl.MaxValue)
                    {
                        Storyboard animation = thisControl.Resources["BeforeChangeStoryboard"] as Storyboard;
                        animation.Begin(thisControl.Template.FindName("grid1", thisControl) as Grid);
                        animation.Completed += (_s, _e2) => thisControl.Text = newValue.ToString();
                    }
                }
            }));


А вторая происходит по триггеру

<EventTrigger RoutedEvent="TextBox.TextChanged">
                    <BeginStoryboard Storyboard="{StaticResource AfterChangeStoryboard}"/>
                </EventTrigger>


Реально событие animation.Completed выполняется в совершенно произвольные моменты, часто вызывая зависание. Подскажите, пожалуйста, как отследить тот момент, когда первая анимация реально завершилась.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.