Как узнать продолжительность раскадровки в Silverlight?

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

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

storyboard.Seek(timespan);

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

storyboard.Duration.TimeSpan

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

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

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


person grimus    schedule 14.12.2009    source источник


Ответы (2)


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

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

person Egor    schedule 14.12.2009
comment
Спасибо за Ваш ответ. Ваш совет помог мне найти хорошее решение. - person grimus; 15.12.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);
    }
}
person grimus    schedule 14.12.2009