Вопрос
Каков правильный способ остановить и перезапустить раскадровку из .net-кода?
Я пытаюсь ...
myStory.Stop(this);
Ожидая, что последующий вызов будет выполнен .Begin(это);перезапустился бы с нулевой временной шкалы, но вместо этого раскадровка возобновилась бы с того места, где она была остановлена.
Я пытался
.Remove(this);
и я попытался
.Seek(TimeSpan.Zero);
что тоже не сработало.
Подробнее ...Вот мой образец раскадровки.
<Storyboard x:Key="overlay">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="textone" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:03.0" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:03.0" Value="1"/>
<SplineDoubleKeyFrame KeyTime="00:00:06.0" Value="1"/>
<SplineDoubleKeyFrame KeyTime="00:00:06.0" Value="0"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="texttwo" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:07.0" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:07.0" Value="1"/>
<SplineDoubleKeyFrame KeyTime="00:00:10.0" Value="1"/>
<SplineDoubleKeyFrame KeyTime="00:00:10.0" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
Таким образом, текст в textone выполняется, и если вы закроете экран и быстро вернетесь к экрану, текст two фактически будет воспроизводиться поверх только что запущенной раскадровки.Таким образом, оригинальная (с первого экрана) раскадровка все еще присутствует и воспроизводится, хотя я удалил и остановил ее.
Решение
Как насчет использования Storyboard.Seek(TimeSpan.Zero)?Подобно поиску в потоке, это должно вернуть вас к началу анимации.
Я прокомментировал, что вы также должны убедиться, что свойству IsControllable присвоено значение true.Имейте это в виду!
Другие советы
Вам нужно будет выполнить MyStory.Remove(this) перед вызовом MyStory.Начните (this), чтобы начать все с нуля.Это связано с тем, что вызов Storyboard::Stop просто останавливает анимационные часы, но оставляет их нетронутыми.Последующий вызов Begin будет просто действовать как резюме.Я согласен, что это несколько противоречит здравому смыслу, однако, если вы прочтете документацию ClockController:: Остановить, в примечаниях вы увидите следующее:
Этот метод изменяет текущее состояние целевых часов на остановленное.
Остановленные часы можно перезапустить, используя метод Begin, Seek или Seekalignedtolastick.
Извини, Скотт, я не обратил внимания.Вы пытались установить заполняющее поведение на раскадровке?Установка FillBehavior в положение Stop сбрасывает анимацию.Хотя не уверен, почему Stop этого не делает...
<Storyboard x:Key="overlay">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="textone" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:03.0" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:03.0" Value="1"/>
<SplineDoubleKeyFrame KeyTime="00:00:06.0" Value="1"/>
<SplineDoubleKeyFrame KeyTime="00:00:06.0" Value="0"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="texttwo" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:07.0" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:07.0" Value="1"/>
<SplineDoubleKeyFrame KeyTime="00:00:10.0" Value="1"/>
<SplineDoubleKeyFrame KeyTime="00:00:10.0" Value="0"/>
</DoubleAnimationUsingKeyFrames>
using System.Windows.Media.Animation;
затем создайте новую раскадровку
Storyboard storyboard_name = (Storyboard)(FindResource("overlay"));
storyboard_name.Begin();
запустится раскадровка "storyboard_name".
если вы хотите остановить раскадровку, пожалуйста, попробуйте вот так
storyboard_name.Stop();
если вы хотите удалить раскадровку, пожалуйста, попробуйте сделать это следующим образом
storyboard_name.Remove();
другими деталями могут быть:
это.Моя имитация.Заполняющее поведение = заполняющее поведение.Остановка;