2012-06-14 12 views
5

Lo he buscado por todas partes y parece que no puedo encontrar una respuesta sobre este. Mi aplicación vive en el mundo de XAML suelto, por lo que debe confiar en XamlReaders y Tree Walking para encontrar elementos. Tengo un componente que maneja la representación de estas páginas XAML. El renderizador necesita saber el estado de los guiones gráficos que podrían ejecutarse en el XAML cargado. Así que lo que me gustaría hacer en mi procesador es algo como esto: -GetCurrentState en un guión gráfico definido e iniciado en 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)** 

Todo muy bien. Sin embargo, el problema es cuando intento una DCompruebe la CurrentState lanza una excepción: -

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

Mirando alrededor veo que es porque necesito para hacer el guión gráfico controlable. Entonces mi pregunta es ¿cómo hago esto en XAML? No empiezo el guión gráfico en el código, por lo que no puedo pasar de verdad en el BeginStoryboard sobrecargado.

Respuesta

5

Me acabo de topar con este mismo problema, así que pensé en compartir mis hallazgos.

Obtiene ese error cuando su guión gráfico no está marcado como controlable. Los guiones gráficos se marcan como Controlable cuando se invoca el método Begin.

Si lo está haciendo desde el código de atrás, entonces simplemente usa una sobrecarga que tiene este argumento booleano IsControllable (list of Begin overloads).

Si usaste el elemento BeginAnimation en Xaml, deberás hacer 2 cosas.

  1. asigne un Name al elemento BeginAnimation. El documentation de esta propiedad indica: "Si el nombre de BeginStoryboard no está especificado, el guión gráfico no se puede afectar de forma interactiva después de haber comenzado"
  2. Cuando intente interactuar con su guión gráfico en código subyacente, debe pasar la referencia al objeto de que su BeginStoryboard fue declarado en.

he aquí un ejemplo que muestra que el paso 1 (nombre de la BeginStoryboard)

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

y he aquí un ejemplo para el paso 2. Puesto que usted ha nombrado a su BeginStoryboard puede utilícelo como una variable local en su clase ... o puede simplemente referencia el guión gráfico real directamente. El punto principal es que debe pasar en el propietario de la BeginStoryboard (que es el botón en este 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); 

He aquí una lista de todos los "acción" métodos en un guión gráfico que requieren que pase en el Poseer elemento de marco: Control a Storyboard After It Starts

Cuestiones relacionadas