Как узнать длительность раскадровки в Silverlight? - PullRequest
1 голос
/ 14 декабря 2009

У меня есть ситуация, когда мне нужно определить, достиг ли я конца раскадровки, а затем мне нужно искать его до конца.

Я хочу сделать:

storyboard.Seek(timespan);

Однако, если временной интервал превышает длительность раскадровки, я получаю исключение. Если я посмотрю на

storyboard.Duration.TimeSpan

Я получаю ошибку, потому что Длительность Автоматическая. Это означает, что я не могу сделать "if (timespan> storyboard.Duration.TimeSpan) ..."

Как только я узнаю, что позиция, которую я ищу, находится за концом раскадровки, мне нужно просто искать конец раскадровки. Я мог бы сделать это с storyboard.Seek (storyboard.Duration.TimeSpan), но опять же, я не могу использовать Duration, потому что он автоматический.

Кажется, что все мои проблемы могут быть решены, если я смогу принудительно отключить Duration от Automatic. Надеюсь, мне просто не хватает чего-то простого.

Ответы [ 2 ]

3 голосов
/ 14 декабря 2009

Может быть, я чего-то не понимаю, но если вам всегда нужно искать конец анимации, почему бы вам не использовать метод seektofill?
MSDN-ссылка

Кроме того, здесь приведена документация по структуре длительности раскадровки, с объяснением того, как вы можете установить для нее что-то отличное от автоматического, если вам нужно - но если вам всегда нужно идти до конца, я бы просто использовал метод скиптофилла:
MSDN-ссылка

1 голос
/ 15 декабря 2009

Посмотрев на страницы, на которые ссылается Егор, я смог найти хорошее решение. (Отметив Егора как ответ, чтобы убедиться, что он получил кредит.)

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

Чтобы обойти эту проблему, я сначала проверяю, доступна ли длительность. Если это не так, я SkipToFill () до конца и использую GetCurrentTime (), чтобы выяснить, каков конец длины раскадровки.

Вот мое полное решение:

public void UpdateControl()
{
    if (!App.IsDesignTime() && storyboard != null)
    {
        TimeSpan begin = DateTime.UtcNow - OriginTime.ToUniversalTime();
        TimeSpan end;

        // If Storyboard.Duration is set, use it to set the animation to its correct position.
        // If it isn't set, attempt to set by seeking to the end of the animation.
        if (storyboard.Duration.HasTimeSpan)
            end = storyboard.Duration.TimeSpan;
        else
        {
            storyboard.SkipToFill();
            end = storyboard.GetCurrentTime();
        }

        if (begin > end)
            begin = end;

        storyboard.Begin();
        storyboard.Seek(begin);
    }
}
...