2012-06-14 1 views
5

Я искал все и не могу найти ответ на этот вопрос. Мое приложение живет в мире свободного XAML, поэтому приходится полагаться на XamlReaders и дерево, чтобы найти элементы. У меня есть компонент, который обрабатывает рендеринг этих страниц XAML. Этот рендерер должен знать состояние раскадровки, которое может работать на загруженном XAML. Итак, что бы я хотел сделать в моем рендерере, это примерно так: -GetCurrentState на раскадровке определен и запущен в XAML

var resources = _currentScreenFrameworkElement.Resources; 
foreach (var item in resources.Values) 
{ 
    if (item is Storyboard) 
    { 
     try 
     { 
      var storyboard = item as Storyboard; 
      **if (storyboard.GetCurrentState() == ClockState.Active)** 

Все хорошо и хорошо. Однако проблема в том, когда я попробовать DУдостоверьтесь, CurrentState он бросает исключение: -

"Cannot perform action because the specified Storyboard was not applied to this object for interactive control." 

Глядя вокруг, я вижу это потому, что мне нужно сделать Раскадровка управляема. Итак, мой вопрос: как это сделать в XAML? Я не начинаю раскадровку в коде, поэтому не могу переходить в перегруженную BeginStoryboard.

ответ

5

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

Вы получаете эту ошибку, если раскадровка не отмечена как Контролируемая. Раскадровки обозначаются как Controllable при вызове метода Begin.

Если вы делаете это из кода позади, вы просто используете перегрузку, которая имеет этот логический аргумент IsControllable (list of Begin overloads).

Если вы использовали элемент BeginAnimation в Xaml, вам нужно сделать 2 вещи.

  1. присвойте Name элементу BeginAnimation. В поле documentation для этого свойства указано: «Если имя BeginStoryboard не указано, раскадровка не может быть интерактивно затронута после ее начала»
  2. Когда вы пытаетесь взаимодействовать с раскадрой в коде, вы должны передать ссылку на объект, который ваш BeginStoryboard был объявлен в.

Вот пример, показывающий вам шаг 1 (имя BeginStoryboard)

<Button Name="btn1" Content="bla"> 
    <Button.Triggers> 
    <EventTrigger RoutedEvent="Button.Click"> 
     <BeginStoryboard 
      Name="bnt1_beginStoryboard" 
      Storyboard={StaticResource someSharedStoryboard}"/> 
    </EventTrigger> 
    </Button.Triggers> 
</Button> 

и вот пример для шага 2. Так как вы назвали ваш BeginStoryboard вы можете используйте это как локальную переменную в своем классе .. или вы можете просто напрямую ссылайтесь на фактическую раскадровку. Главное, что вы должны передать в владельце BeginStoryboard (что кнопка в данном случае)

//The main point here is that we're passing in btn1 
bnt1_beginStoryboard.Storyboard.Stop(btn1); 
bnt1_beginStoryboard.Storyboard.SkipToFill(btn1); 
bnt1_beginStoryboard.Storyboard.Resume(btn1); 

Вот список всех «действие» методы на раскадровке, которые требуют, чтобы пройти в элемент управления: Control a Storyboard After It Starts

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