Ищите анимацию раскадровки назад к определенной точке и затем играйте - PullRequest
0 голосов
/ 23 января 2012

У меня есть простая анимация раскадровки, которая выглядит следующим образом:

 <Window.Resources>
    <Storyboard x:Key="fader">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
            <SplineDoubleKeyFrame KeyTime="0:0:0" Value="0"/>
            <SplineDoubleKeyFrame KeyTime="0:0:0.5" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
            <SplineDoubleKeyFrame KeyTime="0:0:4" Value="1"/>
            <SplineDoubleKeyFrame KeyTime="0:0:6" Value="0"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</Window.Resources>

Как вы можете видеть, она затухает в цели, ждет 3,5 секунды, затем затухает.Я использую его в окне уведомлений, которое появляется, когда происходит событие.

Это прекрасно работает, вызывая следующий код из кода, когда это событие происходит:

board = (Storyboard)FindResource("fader");
board.Begin(this);

Однако я 'Я пытаюсь обработать случай, когда происходит второе событие, когда окно уведомления уже отображается.В этом случае поведение, которое я ищу, состоит в том, чтобы изменить содержимое окна, чтобы отразить второе событие (легкое), и «перемотать» раскадровку на 0,5 с на протяжении всего времени его существования, т.е.сразу после его появления.

Другими словами, второе событие должно вызвать затухание через 3,5 секунды после того, как второе событие произошло, даже если окно уже было где-то между 0 и 6 секундами.

Я попытался сделать это, обнаружив непрозрачность окна, и, если оно> 0, затем вызвал следующее:

board.Seek(this,TimeSpan.FromSeconds(0.5),TimeSeekOrigin.BeginTime);

Однако, похоже, это ничего не делает,и даже если я запускаю события в нем несколько раз, содержимое окна изменяется, но уведомитель покорно исчезает, ждет 3,5 секунды, а затем снова исчезает.

Почему это не работает, и это лучший способделать то, что я пытаюсь достичь?

1 Ответ

1 голос
/ 26 января 2012

Я думаю, что проблема здесь в том, что у вас есть постепенное увеличение и уменьшение в качестве одной анимации.Я бы, вероятно, сделал что-то вроде следующего:

  1. Разделить анимацию на две части: постепенное появление и постепенное исчезновение.
  2. Определение displayPeriod постоянного значения 3,5 с.(или что вы хотите. Настраиваемая пользователем настройка?).
  3. Когда приходит уведомление, запускается событие.Если это первое уведомление, запустите постепенную анимацию.Если это не первое уведомление, перейдите к пункту 5.
  4. Запустите таймер, который будет отсчитывать количество секунд displayPeriod.
  5. Если до истечения времени таймера поступит другое уведомление, отмените егои запустите его снова.
  6. Когда время таймера наконец истечет, запустите анимацию затухания.

Можно написать больше кода, но, возможно, это проще, чем пытаться подвести анимацию кправильная точка в раскадровке.

Если вы хотите, чтобы при внедрении этой технологии работала какая-то крутая и умопомрачительная технология, проверьте Reactive Extensions для обработки ваших потоков уведомлений и событий таймера.

...