2016-01-13 2 views
1

Я хотел бы проверить, был ли запущен 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); 
} 
+0

Вы пробовали что-то вроде просмотра, если [Clock.CurrentState] (https://msdn.microsoft.com/en-us/library/system.windows.media.animation.clock.currentstate%28v=vs.110% 29.aspx) активен? Звучит как жесткий сценарий. –

+0

@ChrisW. Единственный способ получить доступ к этому из контекста - использовать Storyboard.CreateClock(), и в этот момент меня беспокоит то, что это неточно. Просто отметить, что он * делает * работу, чтобы поймать исключение и вернуть выведенное значение «нулевого прогресса». Последующие вызовы управления раскадрой прекрасно функционируют после раскадровки.Begin (isControllable). Я немного поиграю с вашим предложением и посмотрю, что произойдет. – erodewald

+0

Да, я никогда не сталкивался с тем, что вы пытаетесь сделать, любопытно. ура –

ответ

0

Чтобы обойти эту проблему является единственным способом запросить раскадровки состояние без запуска его. Любая попытка запросить раскадровку (с использованием storyboard.Get...()) перед запуском в C# с использованием переопределения IsControllable приведет к ошибке. Следующий код настолько близок, насколько вы можете получить на основе моих исследований с помощью документации MSDN.

Код

double progress = 0.0d; 
try { 
    progress = GetProgress(); // Query storyboard status 
} catch { 
    // Do nothing if the exception is thrown, we knew this would happen 
} 
if (progress == 0.0d) 
    BeginStoryboard(); 
else PauseStoryboard(); 
0

Подписаться на Storyboard «s CurrentStateInvalidated событие. Как только он будет вызван (сначала отправится в Active), вы знаете, что был запущен Storyboard. Установите флаг, чтобы запомнить это. Очевидно, до тех пор он не работал (ваш флаг является ложным).

Смежные вопросы