Я хотел бы проверить, был ли запущен Storyboard
, прежде чем я начну его на C#. Конечно, любые попытки использовать GetCurrentState()
, GetCurrentProgress()
приведут к исключению, если вы не использовали storyboardInstance.Begin(FrameworkElement, FrameworkElementTemplate, isControllable)
. Проблема в том, что я не хочу запускать раскадровку.Можно ли управлять раскадрой без его запуска?
Документация довольно тонкая на эту тему, и запросы Google дают мало результатов, поэтому я могу только предположить, что я злоупотребляю этой функциональностью. Единственный способ проверить состояние, о котором я могу думать, - это поймать исключение, но это просто кажется таким ужасным.
Какие-нибудь лучшие идеи?
Пример для удовлетворения требований
<TextBlock x:Name="textBlock">
<TextBlock.Triggers>
<EventTrigger RoutedEvent="SomeFakeEventICreated">
<BeginStoryboard x:Name="storyBoard">
<Storyboard>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:10"
Storyboard.TargetName="BackgroundLogo"
Storyboard.TargetProperty="Opacity">
<EasingDoubleKeyFrame KeyTime="00:00:00.0" Value="1" />
<EasingDoubleKeyFrame KeyTime="00:00:10" Value="1" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</TextBlock.Triggers>
<TextBlock>
public void DoSomethingStoryboardy(){
// EXAMPLE OF FAILURE
if (GetProgress() == 0.0d) // Exception
BeginStoryboard();
// EXAMPLE OF SUCCESS
// but what a shameful way to do this
double progress = 0.0d;
try {
progress = GetProgress();
} catch { }
if (progress == 0.0d)
BeginStoryboard();
else PauseStoryboard();
}
public void GetProgress() {
// Pass in containing object
double progress = storyBoard.Storyboard.GetCurrentProgress(textBlock);
// Exception is thrown: Cannot perform action because the specified Storyboard was not applied to this object for interactive control.
// This behavior is exactly as you'd expect, because the documentation states it needs to be controllable before you can call any of these "Get...()" methods.
}
public void BeginStoryboard() {
// Only Begin() allows setting IsControllable
storyBoard.Storyboard.Begin(containingObject: textBlock, frameworkElementTemplate: null, isControllable: true);
// Storyboard control after Begin() works fine because it has started already
double progress = storyBoard.Storyboard.GetCurrentProgress(textBlock);
}
public void PauseStoryboard() {
storyBoard.Storyboard.Pause(textBlock);
}
Вы пробовали что-то вроде просмотра, если [Clock.CurrentState] (https://msdn.microsoft.com/en-us/library/system.windows.media.animation.clock.currentstate%28v=vs.110% 29.aspx) активен? Звучит как жесткий сценарий. –
@ChrisW. Единственный способ получить доступ к этому из контекста - использовать Storyboard.CreateClock(), и в этот момент меня беспокоит то, что это неточно. Просто отметить, что он * делает * работу, чтобы поймать исключение и вернуть выведенное значение «нулевого прогресса». Последующие вызовы управления раскадрой прекрасно функционируют после раскадровки.Begin (isControllable). Я немного поиграю с вашим предложением и посмотрю, что произойдет. – erodewald
Да, я никогда не сталкивался с тем, что вы пытаетесь сделать, любопытно. ура –