2012-06-14 11 views
5

Ho cercato dappertutto e non riesco a trovare una risposta su questo. La mia app vive nel mondo di XAML loose, quindi deve fare affidamento su XamlReaders e tree walking per trovare elementi. Ho un componente che gestisce il rendering di queste pagine XAML. Questo renderizzatore deve conoscere lo stato degli storyboard che potrebbero essere in esecuzione sullo XAML caricato. Quindi quello che mi piacerebbe fare nel mio renderer è qualcosa del genere: -GetCurrentState su uno storyboard definito e avviato in 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)** 

Tutto bene. Tuttavia, il problema è quando provo un DControllare il CurrentState viene generata un'eccezione: -

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

Guardando intorno vedo che è perché ho bisogno di fare lo storyboard controllabile. Quindi la mia domanda è: come faccio a farlo in XAML? Non avvio lo storyboard in codice, quindi non posso passare true in BeginStoryboard sovraccarico.

risposta

5

Mi sono imbattuto in questo stesso problema, quindi ho pensato di condividere le mie scoperte.

Si ottiene questo errore quando lo storyboard non è contrassegnato come Controllabile. Gli storyboard sono contrassegnati come controllabili quando viene chiamato il metodo Begin.

Se lo si sta eseguendo dal codice sottostante, si utilizza solo un overload con questo argomento booleano IsControllable (list of Begin overloads).

Se hai utilizzato l'elemento BeginAnimation in Xaml, dovrai eseguire 2 operazioni.

  1. assegnare un elemento Name all'elemento BeginAnimation. Lo documentation per questa proprietà indica: "Se il nome di BeginStoryboard non è specificato, lo storyboard non può essere influenzato in modo interattivo dopo l'inizio"
  2. Quando si tenta di interagire con lo storyboard in codebehind è necessario passare il riferimento al oggetto che il vostro BeginStoryboard è stata dichiarata nel.

Ecco un esempio che mostra passo 1 (il nome del BeginStoryboard)

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

ed ecco un esempio per il passaggio 2. Dal momento che hai chiamato il tuo BeginStoryboard si può usa quella come variabile locale nella tua classe .. o puoi semplicemente fai riferimento direttamente allo storyboard vero e proprio. Il punto principale è che è necessario passare il proprietario del BeginStoryboard (che è il pulsante in questo caso)

//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); 

Ecco una lista di tutti i metodi "azione" su uno storyboard che richiedono di passare in possedere elemento quadro: Control a Storyboard After It Starts

Problemi correlati