Información general sobre objetos StoryboardStoryboards Overview

En este tema se muestra cómo Storyboard utilizar objetos para organizar y aplicar animaciones.This topic shows how to use Storyboard objects to organize and apply animations. Describe cómo manipular Storyboard objetos de forma interactiva y describe la sintaxis de destinatarios de propiedades indirectas.It describes how to interactively manipulate Storyboard objects and describes indirect property targeting syntax.

Requisitos previosPrerequisites

Para entender este tema, debe estar familiarizado con los distintos tipos de animaciones y sus características básicas.To understand this topic, you should be familiar with the different animation types and their basic features. Para obtener una introducción a la animación, consulte Información general sobre animaciones.For an introduction to animation, see the Animation Overview. También debe saber utilizar las propiedades asociadas.You should also know how to use attached properties. Para obtener más información sobre las propiedades adjuntas, consulte Información general sobre propiedades asociadas.For more information about attached properties, see the Attached Properties Overview.

¿Qué es un guión gráfico?What Is a Storyboard?

Las animaciones no son el único tipo útil de escala de tiempo.Animations are not the only useful type of timeline. Se proporcionan otras clases de escalas de tiempo para ayudarle a organizar conjuntos de escalas de tiempo y para aplicar las escalas de tiempo a las propiedades.Other timeline classes are provided to help you organize sets of timelines, and to apply timelines to properties. Las escalas de tiempo de TimelineGroup contenedor se derivan ParallelTimeline de Storyboardla clase e incluyen y.Container timelines derive from the TimelineGroup class, and include ParallelTimeline and Storyboard.

Un Storyboard es un tipo de escala de tiempo de contenedor que proporciona información de destino para las escalas de tiempo que contiene.A Storyboard is a type of container timeline that provides targeting information for the timelines it contains. Un guión gráfico puede contener cualquier tipo Timelinede, incluidas otras escalas de tiempo y animaciones de contenedor.A Storyboard can contain any type of Timeline, including other container timelines and animations. Storyboardlos objetos permiten combinar las escalas de tiempo que afectan a una variedad de objetos y propiedades en un único árbol de escala de tiempo, lo que facilita la organización y el control de los comportamientos complejos de temporización.Storyboard objects enable you to combine timelines that affect a variety of objects and properties into a single timeline tree, making it easy to organize and control complex timing behaviors. Por ejemplo, supongamos que desea un botón que haga estas tres cosas.For example, suppose you want a button that does these three things.

  • Aumentar de tamaño y cambiar de color cuando el usuario selecciona el botón.Grow and change color when the user selects the button.

  • Disminuir de tamaño y volver a su tamaño original cuando se hace clic en él.Shrink away and then grow back to its original size when clicked.

  • Disminuir de tamaño y desvanecerse con un fundido al 50 % de opacidad al deshabilitarse.Shrink and fade to 50 percent opacity when it becomes disabled.

En este caso, tenemos varios conjuntos de animaciones que se aplican al mismo objeto, y hay que reproducirlas en distintos momentos, según cuál sea el estado del botón.In this case, you have multiple sets of animations that apply to the same object, and you want to play at different times, dependent on the state of the button. Storyboardlos objetos permiten organizar animaciones y aplicarlas en grupos a uno o varios objetos.Storyboard objects enable you to organize animations and apply them in groups to one or more objects.

¿Dónde se puede utilizar un guión gráfico?Where Can You Use a Storyboard?

Se puede utilizar para animar propiedades de dependencia de clases que se pueden animar (para obtener más información sobre lo que hace que una clase se pueda animar, vea información general sobre animaciones). StoryboardA Storyboard can be used to animate dependency properties of animatable classes (for more information about what makes a class animatable, see the Animation Overview). Sin embargo, dado que el guion gráfico es una característica de nivel NameScope FrameworkElement de marco, el objeto debe pertenecer a FrameworkContentElementla de o.However, because storyboarding is a framework-level feature, the object must belong to the NameScope of a FrameworkElement or a FrameworkContentElement.

Por ejemplo, puede usar Storyboard para hacer lo siguiente:For example, you could use a Storyboard to do the following:

Sin embargo, no se puede usar Storyboard para animar SolidColorBrush un que no haya FrameworkElement registrado su nombre con o FrameworkContentElement, o no se haya utilizado para establecer una propiedad de FrameworkElement un FrameworkContentElemento.However, you could not use a Storyboard to animate a SolidColorBrush that did not register its name with a FrameworkElement or FrameworkContentElement, or was not used to set a property of a FrameworkElement or FrameworkContentElement.

Cómo aplicar animaciones mediante un guión gráficoHow to Apply Animations with a Storyboard

Para usar un Storyboard objeto para organizar y aplicar animaciones, agregue las animaciones como escalas Storyboardde tiempo secundarias de.To use a Storyboard to organize and apply animations, you add the animations as child timelines of the Storyboard. La Storyboard clase proporciona las Storyboard.TargetName propiedades Storyboard.TargetProperty adjuntas y.The Storyboard class provides the Storyboard.TargetName and Storyboard.TargetProperty attached properties. Se establecen estas propiedades de una animación para especificar su objeto y propiedad de destino.You set these properties on an animation to specify its target object and property.

Para aplicar animaciones a sus destinos, comienza Storyboard con una acción de desencadenador o un método.To apply animations to their targets, you begin the Storyboard using a trigger action or a method. En XAMLXAML, se utiliza un BeginStoryboard objeto con EventTrigger, Triggero DataTrigger.In XAMLXAML, you use a BeginStoryboard object with an EventTrigger, Trigger, or DataTrigger. En el código, también puede utilizar el Begin método.In code, you can also use the Begin method.

En la tabla siguiente se muestran los distintos lugares Storyboard en los que se admite cada técnica de Inicio: por instancia, estilo, plantilla de control y plantilla de datos.The following table shows the different places where each Storyboard begin technique is supported: per-instance, style, control template, and data template. "Por instancia" se refiere a la técnica de aplicar directamente una animación o guión gráfico a las instancias de un objeto, en lugar de en un estilo, una plantilla de control o una plantilla de datos."Per-Instance" refers to the technique of applying an animation or storyboard directly to instances of an object, rather than in a style, control template, or data template.

El guión gráfico se comienza utilizando...Storyboard is begun using… Por instanciaPer-instance EstiloStyle Plantilla de controlControl template Plantilla de datosData template EjemploExample
BeginStoryboardy unEventTriggerBeginStoryboard and an EventTrigger Yes Yes Yes Yes Animar una propiedad utilizando un guión gráficoAnimate a Property by Using a Storyboard
BeginStoryboardy una propiedadTriggerBeginStoryboard and a property Trigger SinNo Yes Yes Yes Activar una animación al cambiar el valor de una propiedadTrigger an Animation When a Property Value Changes
BeginStoryboardy unDataTriggerBeginStoryboard and a DataTrigger SinNo Yes Yes Yes Cómo: Desencadenar una animación cuando cambien los datosHow to: Trigger an Animation When Data Changes
Método BeginBegin method Yes NoNo NoNo SinNo Animar una propiedad utilizando un guión gráficoAnimate a Property by Using a Storyboard

Storyboard En el ejemplo siguiente se usa para animar el Rectangle Width de un elemento Color y el SolidColorBrush de un que se Rectangleusa para pintar ese.The following example uses a Storyboard to animate the Width of a Rectangle element and the Color of a SolidColorBrush used to paint that Rectangle.

<!-- This example shows how to animate with a storyboard.-->
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="Microsoft.Samples.Animation.StoryboardsExample" 
  WindowTitle="Storyboards Example">
  <StackPanel Margin="20">
    
    <Rectangle Name="MyRectangle"
      Width="100"
      Height="100">
      <Rectangle.Fill>
        <SolidColorBrush x:Name="MySolidColorBrush" Color="Blue" />
      </Rectangle.Fill>
      <Rectangle.Triggers>
        <EventTrigger RoutedEvent="Rectangle.MouseEnter">
          <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation 
                Storyboard.TargetName="MyRectangle"
                Storyboard.TargetProperty="Width"
                From="100" To="200" Duration="0:0:1" />
              
              <ColorAnimation 
                Storyboard.TargetName="MySolidColorBrush"
                Storyboard.TargetProperty="Color"
                From="Blue" To="Red" Duration="0:0:1" />  
            </Storyboard>
          </BeginStoryboard>
        </EventTrigger>
      </Rectangle.Triggers>
    </Rectangle> 
  </StackPanel>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Data;
using System.Windows.Shapes;
using System.Windows.Input;


namespace Microsoft.Samples.Animation
{
    public class StoryboardsExample : Page
    {      
        public StoryboardsExample()
        {
            this.WindowTitle = "Storyboards Example";
            StackPanel myStackPanel = new StackPanel();
            myStackPanel.Margin = new Thickness(20);

            Rectangle myRectangle = new Rectangle();
            myRectangle.Name = "MyRectangle";
            
            // Create a name scope for the page.
            NameScope.SetNameScope(this, new NameScope());            
            
            this.RegisterName(myRectangle.Name, myRectangle);
            myRectangle.Width = 100;
            myRectangle.Height = 100;
            SolidColorBrush mySolidColorBrush = new SolidColorBrush(Colors.Blue);
            this.RegisterName("MySolidColorBrush", mySolidColorBrush);
            myRectangle.Fill = mySolidColorBrush;
            
            DoubleAnimation myDoubleAnimation = new DoubleAnimation();
            myDoubleAnimation.From = 100;
            myDoubleAnimation.To = 200;
            myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(1));
            Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);
            Storyboard.SetTargetProperty(myDoubleAnimation, 
                new PropertyPath(Rectangle.WidthProperty));
            
            ColorAnimation myColorAnimation = new ColorAnimation();
            myColorAnimation.From = Colors.Blue;
            myColorAnimation.To = Colors.Red;
            myColorAnimation.Duration = new Duration(TimeSpan.FromSeconds(1));
            Storyboard.SetTargetName(myColorAnimation, "MySolidColorBrush");
            Storyboard.SetTargetProperty(myColorAnimation, 
                new PropertyPath(SolidColorBrush.ColorProperty)); 
            Storyboard myStoryboard = new Storyboard();
            myStoryboard.Children.Add(myDoubleAnimation);
            myStoryboard.Children.Add(myColorAnimation);

            myRectangle.MouseEnter += delegate(object sender, MouseEventArgs e)
            {
                myStoryboard.Begin(this);
            };
            
            myStackPanel.Children.Add(myRectangle);
            this.Content = myStackPanel;
        } 
    }
}

En las secciones siguientes se TargetName describen TargetProperty los y las propiedades adjuntas con más detalle.The following sections describe the TargetName and TargetProperty attached properties in more detail.

Establecer como destino elementos de marco, elementos de contenido de marco y elementos inmovilizablesTargeting Framework Elements, Framework Content Elements, and Freezables

En la sección anterior se menciona que, para que una animación encuentre su destino, debe conocer el nombre del mismo y la propiedad que debe animar.The previous section mentioned that, for an animation to find its target, it must know the target's name and the property to animate. Especificar la propiedad que se va a animar es sencillo: Storyboard.TargetProperty simplemente se establece con el nombre de la propiedad que se va a animar.Specifying the property to animate is straight forward: simply set Storyboard.TargetProperty with the name of the property to animate. El nombre del objeto cuya propiedad se desea animar se especifica estableciendo la Storyboard.TargetName propiedad en la animación.You specify the name of the object whose property you want to animate by setting the Storyboard.TargetName property on the animation.

Para que TargetName la propiedad funcione, el objeto de destino debe tener un nombre.For the TargetName property to work, the targeted object must have a name. Asignar FrameworkElement un nombre a un FrameworkContentElement o a en XAMLXAML es diferente de asignar un nombre a un Freezable objeto.Assigning a name to a FrameworkElement or a FrameworkContentElement in XAMLXAML is different than assigning a name to a Freezable object.

Los elementos de marco son las clases que heredan de la FrameworkElement clase.Framework elements are those classes that inherit from the FrameworkElement class. Entre los ejemplos de elementos Windowde DockPanelmarco se incluyen Rectangle,, Buttony.Examples of framework elements include Window, DockPanel, Button, and Rectangle. En esencia, todas las ventanas, los paneles y los controles son elementos.Essentially all windows, panels, and controls are elements. Los elementos de contenido de marco son las clases que FrameworkContentElement heredan de la clase.Framework content elements are those classes that inherit from the FrameworkContentElement class. Entre los ejemplos de elementos de FlowDocument contenido Paragraphde marco se incluyen y.Examples of framework content elements include FlowDocument and Paragraph. Si no está seguro de si un tipo es un elemento de marco o un elemento de contenido de marco, compruebe si tiene una propiedad Name.If you're not sure whether a type is a framework element or a framework content element, check to see whether it has a Name property. Si la tiene, probablemente sea un elemento de marco o un elemento de contenido de marco.If it does, it's probably a framework element or a framework content element. Para estar seguro, compruebe la sección de jerarquía de herencia de su página de tipo.To be sure, check the Inheritance Hierarchy section of its type page.

Para habilitar el destino de un elemento de marco o un elemento de contenido de XAMLXAMLmarco en, establezca Name su propiedad.To enable the targeting of a framework element or a framework content element in XAMLXAML, you set its Name property. En el código, también debe usar el RegisterName método para registrar el nombre del elemento con el elemento para el que ha creado un. NameScopeIn code, you also need to use the RegisterName method to register the element's name with the element for which you've created a NameScope.

En el ejemplo siguiente, tomado del ejemplo anterior, se asigna el nombre MyRectangle a Rectangle, un tipo de FrameworkElement.The following example, taken from the preceding example, assigns the name MyRectangle a Rectangle, a type of FrameworkElement.

<Rectangle Name="MyRectangle"
  Width="100"
  Height="100">
Rectangle myRectangle = new Rectangle();
myRectangle.Name = "MyRectangle";

// Create a name scope for the page.
NameScope.SetNameScope(this, new NameScope());            

this.RegisterName(myRectangle.Name, myRectangle);

Una vez que tenga un nombre, puede animar una propiedad de ese elemento.After it has a name, you can animate a property of that element.

<DoubleAnimation 
  Storyboard.TargetName="MyRectangle"
  Storyboard.TargetProperty="Width"
  From="100" To="200" Duration="0:0:1" />
Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);
Storyboard.SetTargetProperty(myDoubleAnimation, 
    new PropertyPath(Rectangle.WidthProperty));

Freezablelos tipos son las clases que heredan Freezable de la clase.Freezable types are those classes that inherit from the Freezable class. Entre los Freezable ejemplos SolidColorBrushde RotateTransformse incluyen GradientStop, y.Examples of Freezable include SolidColorBrush, RotateTransform, and GradientStop.

Para habilitar el destino de un Freezable mediante una animación en XAMLXAML, utilice la Directiva x:Name para asignarle un nombre.To enable the targeting of a Freezable by an animation in XAMLXAML, you use the x:Name Directive to assign it a name. En el código, se usa RegisterName el método para registrar su nombre en el elemento para el que se ha NameScopecreado.In code, you use the RegisterName method to register its name with the element for which you've created a NameScope.

En el ejemplo siguiente se asigna un nombre a un Freezable objeto.The following example assigns a name to a Freezable object.

<SolidColorBrush x:Name="MySolidColorBrush" Color="Blue" />
SolidColorBrush mySolidColorBrush = new SolidColorBrush(Colors.Blue);
this.RegisterName("MySolidColorBrush", mySolidColorBrush);

A continuación, ya se puede establecer el objeto como destino de una animación.The object can then be targeted by an animation.

<ColorAnimation 
  Storyboard.TargetName="MySolidColorBrush"
  Storyboard.TargetProperty="Color"
  From="Blue" To="Red" Duration="0:0:1" />  
Storyboard.SetTargetName(myColorAnimation, "MySolidColorBrush");
Storyboard.SetTargetProperty(myColorAnimation, 
    new PropertyPath(SolidColorBrush.ColorProperty)); 

Storyboardlos objetos utilizan ámbitos de nombres para resolver TargetName la propiedad.Storyboard objects use name scopes to resolve the TargetName property. Para obtener más información sobre los ámbitos de nombres de WPF, consulte Ámbitos de nombres XAML de WPF.For more information about WPF name scopes, see WPF XAML Namescopes. Si se TargetName omite la propiedad, la animación tiene como destino el elemento en el que se define o, en el caso de los estilos, el elemento con estilo.If the TargetName property is omitted, the animation targets the element on which it is defined, or, in the case of styles, the styled element.

A veces no se puede asignar un nombre Freezable a un objeto.Sometimes a name can't be assigned to a Freezable object. Por ejemplo, si Freezable se declara como recurso o se utiliza para establecer un valor de propiedad en un estilo, no se le puede asignar un nombre.For example, if a Freezable is declared as a resource or used to set a property value in a style, it can't be given a name. Al no tener nombre, no se puede establecer como destino directamente, pero sí de manera indirecta.Because it doesn't have a name, it can't be targeted directly—but it can be targeted indirectly. En las secciones siguientes se describe cómo utilizar el establecimiento indirecto de destinos.The following sections describe how to use indirect targeting.

Establecimiento indirecto de destinosIndirect Targeting

Hay veces Freezable que una animación no puede destinarla directamente, como Freezable cuando se declara como recurso o se utiliza para establecer un valor de propiedad en un estilo.There are times a Freezable can't be targeted directly by an animation, such as when the Freezable is declared as a resource or used to set a property value in a style. En estos casos, aunque no pueda dirigirse directamente a él, todavía puede animar Freezable el objeto.In these cases, even though you can't target it directly, you can still animate the Freezable object. En lugar de establecer la TargetName propiedad con el nombre Freezablede, se le asigna el nombre del elemento al que Freezable pertenece ".Instead of setting the TargetName property with the name of the Freezable, you give it the name of the element to which the Freezable "belongs." Por ejemplo, SolidColorBrush que se usa para establecer Fill el de un elemento de rectángulo pertenece a ese rectángulo.For example, a SolidColorBrush used to set the Fill of a rectangle element belongs to that rectangle. Para animar el pincel, debería establecer la propiedad de TargetProperty la animación con una cadena de propiedades que comienza en la propiedad del elemento de marco o Freezable elemento de contenido de marco que se usó para establecer Freezable y termina con la propiedad que se va a animar.To animate the brush, you would set the animation's TargetProperty with a chain of properties that starts at the property of the framework element or framework content element the Freezable was used to set and ends with the Freezable property to animate.

<ColorAnimation 
  Storyboard.TargetName="Rectangle01"
  Storyboard.TargetProperty="Fill.Color"
  From="Blue" To="AliceBlue" Duration="0:0:1" />
DependencyProperty[] propertyChain =
    new DependencyProperty[]
        {Rectangle.FillProperty, SolidColorBrush.ColorProperty};
string thePath = "(0).(1)";
PropertyPath myPropertyPath = new PropertyPath(thePath, propertyChain);
Storyboard.SetTargetProperty(myColorAnimation, myPropertyPath);

Tenga en cuenta que, Freezable si el está inmovilizado, se realizará un clon y ese clon se animará.Note that, if the Freezable is frozen, a clone will be made, and that clone will be animated. Cuando esto sucede, la propiedad del HasAnimatedProperties objeto original continúa devolviendo false, porque el objeto original no se anima realmente.When this happens, the original object's HasAnimatedProperties property continues to return false, because the original object is not actually animated. Para obtener más información sobre la clonación, vea información general sobre objetos Freezable.For more information about cloning, see the Freezable Objects Overview.

Además, tenga en cuenta que, al utilizar el establecimiento indirecto de propiedades de destino, es posible establecer como destino objetos que no existen.Also note that, when using indirect property targeting, it's possible to target objects that don't exist. Por ejemplo, puede suponer que el Background de un botón determinado se ha establecido con SolidColorBrush un e intenta animar su color LinearGradientBrush , cuando de hecho se ha utilizado para establecer el fondo del botón.For example, you might assume that the Background of a particular button was set with a SolidColorBrush and try to animate its Color, when in fact a LinearGradientBrush was used to set the button's Background. En estos casos, no se produce ninguna excepción; la animación no tiene ningún efecto visible porque LinearGradientBrush no reacciona a los cambios en la Color propiedad.In these cases, no exception is thrown; the animation fails to have a visible effect because LinearGradientBrush does not react to changes to the Color property.

En las secciones siguientes se describe con mayor detalle la sintaxis de establecimiento indirecto de propiedades de destino.The following sections describe indirect property targeting syntax in more detail.

Establecer de manera indirecta una propiedad de destino de un objeto inmovilizable en XAMLIndirectly Targeting a Property of a Freezable in XAML

Para establecer como destino una propiedad de un Freezable XAMLXAMLen, utilice la siguiente sintaxis.To target a property of a freezable in XAMLXAML, use the following syntax.

ElementPropertyName . FreezablePropertyNameElementPropertyName . FreezablePropertyName

WhereWhere

En el código siguiente se muestra cómo animar Color de un SolidColorBrush que se usa Fill para establecer el de un elemento de rectángulo.The following code shows how to animate the Color of a SolidColorBrush used to set the Fill of a rectangle element.

<Rectangle
  Name="Rectangle01"
  Height="100"
  Width="100"
  Fill="{StaticResource MySolidColorBrushResource}">
  <Rectangle.Triggers>
    <EventTrigger RoutedEvent="Rectangle.MouseEnter">
      <BeginStoryboard>
        <Storyboard>
          <ColorAnimation 
            Storyboard.TargetName="Rectangle01"
            Storyboard.TargetProperty="Fill.Color"
            From="Blue" To="AliceBlue" Duration="0:0:1" />
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Rectangle.Triggers>
</Rectangle>

En ocasiones, es preciso establecer como destino un objeto inmovilizable contenido en una colección o matriz.Sometimes you need to target a freezable contained in a collection or array.

Para establecer como destino un objeto inmovilizable contenido en una colección, se utiliza la sintaxis de ruta de acceso siguiente.To target a freezable contained in a collection, you use the following path syntax.

ElementPropertyName .Children[ CollectionIndex ]. FreezablePropertyNameElementPropertyName .Children[ CollectionIndex ]. FreezablePropertyName

Donde CollectionIndex es el índice del objeto en su matriz o colección.Where CollectionIndex is the index of the object in its array or collection.

Por ejemplo, supongamos que un rectángulo TransformGroup tiene un recurso aplicado RenderTransform a su propiedad y desea animar una de las transformaciones que contiene.For example, suppose that a rectangle has a TransformGroup resource applied to its RenderTransform property, and you want to animate one of the transforms it contains.

<TransformGroup x:Key="MyTransformGroupResource"
  x:Shared="False">
  <ScaleTransform />
  <RotateTransform />
</TransformGroup>

En el código siguiente Angle RotateTransform se muestra cómo animar la propiedad del que se muestra en el ejemplo anterior.The following code shows how to animate the Angle property of the RotateTransform shown in the previous example.

<Rectangle
  Name="Rectangle02"
  Height="100"
  Width="100"
  Fill="Blue"
  RenderTransform="{StaticResource MyTransformGroupResource}">
  <Rectangle.Triggers>
    <EventTrigger RoutedEvent="Rectangle.MouseEnter">
      <BeginStoryboard>
        <Storyboard>
          <DoubleAnimation 
            Storyboard.TargetName="Rectangle02"
            Storyboard.TargetProperty="RenderTransform.Children[1].Angle"
            From="0" To="360" Duration="0:0:1" />
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Rectangle.Triggers>
</Rectangle>  

Establecer de manera indirecta una propiedad de destino de un objeto inmovilizable mediante códigoIndirectly Targeting a Property of a Freezable in Code

En el código, se crea PropertyPath un objeto.In code, you create a PropertyPath object. Al crear el PropertyPath, se Path especifican y PathParameters.When you create the PropertyPath, you specify a Path and PathParameters.

Para crear PathParameters, cree una matriz de tipo DependencyProperty que contenga una lista de campos de identificador de propiedad de dependencia.To create PathParameters, you create an array of type DependencyProperty that contains a list of dependency property identifier fields. El primer campo de identificador es para la propiedad de FrameworkElement o FrameworkContentElement que Freezable se usa para establecer.The first identifier field is for the property of the FrameworkElement or FrameworkContentElement that the Freezable is used to set. El siguiente campo de identificador representa la propiedad de Freezable destino.The next identifier field represents the property of the Freezable to target. Considérelo como una cadena de propiedades que conecta Freezable con el FrameworkElement objeto.Think of it as a chain of properties that connects the Freezable to the FrameworkElement object.

El siguiente es un ejemplo de una cadena de propiedades de dependencia que Color tiene como SolidColorBrush destino el de un Fill que se usa para establecer el de un elemento de rectángulo.The following is an example of a dependency property chain that targets the Color of a SolidColorBrush used to set the Fill of a rectangle element.

DependencyProperty[] propertyChain =
    new DependencyProperty[]
        {Rectangle.FillProperty, SolidColorBrush.ColorProperty};

También debe especificar un Path.You also need to specify a Path. Un Path es un String que indica Path a cómo interpretar su PathParameters.A Path is a String that tells the Path how to interpret its PathParameters. Se usa la siguiente sintaxis:It uses the following syntax.

( OwnerPropertyArrayIndex ).( FreezablePropertyArrayIndex )( OwnerPropertyArrayIndex ).( FreezablePropertyArrayIndex )

WhereWhere

  • OwnerPropertyArrayIndex es el índice de la DependencyProperty matriz que contiene el identificador de la FrameworkElement propiedad del objeto que Freezable se usa para establecer yOwnerPropertyArrayIndex is the index of the DependencyProperty array that contains the identifier of the FrameworkElement object's property that the Freezable is used to set, and

  • FreezablePropertyArrayIndex es el índice de la DependencyProperty matriz que contiene el identificador de la propiedad que se va a usar como destino.FreezablePropertyArrayIndex is the index of the DependencyProperty array that contains the identifier of property to target.

En el ejemplo siguiente se Path muestra el que acompañaría al PathParameters definido en el ejemplo anterior.The following example shows the Path that would accompany the PathParameters defined in the preceding example.

DependencyProperty[] propertyChain =
    new DependencyProperty[]
        {Rectangle.FillProperty, SolidColorBrush.ColorProperty};
string thePath = "(0).(1)";

En el ejemplo siguiente se combina el código de los ejemplos anteriores para Color animar SolidColorBrush el de un que Fill se usa para establecer el de un elemento de rectángulo.The following example combines the code in the previous examples to animate the Color of a SolidColorBrush used to set the Fill of a rectangle element.


// Create a name scope for the page.
NameScope.SetNameScope(this, new NameScope()); 

Rectangle rectangle01 = new Rectangle();
rectangle01.Name = "Rectangle01";   
this.RegisterName(rectangle01.Name, rectangle01);
rectangle01.Width = 100;
rectangle01.Height = 100;
rectangle01.Fill = 
    (SolidColorBrush)this.Resources["MySolidColorBrushResource"];

ColorAnimation myColorAnimation = new ColorAnimation();
myColorAnimation.From = Colors.Blue;
myColorAnimation.To = Colors.AliceBlue;
myColorAnimation.Duration = new Duration(TimeSpan.FromSeconds(1));
Storyboard.SetTargetName(myColorAnimation, rectangle01.Name);

DependencyProperty[] propertyChain =
    new DependencyProperty[]
        {Rectangle.FillProperty, SolidColorBrush.ColorProperty};
string thePath = "(0).(1)";
PropertyPath myPropertyPath = new PropertyPath(thePath, propertyChain);
Storyboard.SetTargetProperty(myColorAnimation, myPropertyPath);

Storyboard myStoryboard = new Storyboard();
myStoryboard.Children.Add(myColorAnimation);
BeginStoryboard myBeginStoryboard = new BeginStoryboard();
myBeginStoryboard.Storyboard = myStoryboard;
EventTrigger myMouseEnterTrigger = new EventTrigger();
myMouseEnterTrigger.RoutedEvent = Rectangle.MouseEnterEvent;
myMouseEnterTrigger.Actions.Add(myBeginStoryboard);
rectangle01.Triggers.Add(myMouseEnterTrigger);

En ocasiones, es preciso establecer como destino un objeto inmovilizable contenido en una colección o matriz.Sometimes you need to target a freezable contained in a collection or array. Por ejemplo, supongamos que un rectángulo TransformGroup tiene un recurso aplicado RenderTransform a su propiedad y desea animar una de las transformaciones que contiene.For example, suppose that a rectangle has a TransformGroup resource applied to its RenderTransform property, and you want to animate one of the transforms it contains.

<TransformGroup x:Key="MyTransformGroupResource"
  x:Shared="False">
  <ScaleTransform />
  <RotateTransform />
</TransformGroup>  

Para establecer como Freezable destino un contenido en una colección, use la sintaxis de ruta de acceso siguiente.To target a Freezable contained in a collection, you use the following path syntax.

( OwnerPropertyArrayIndex ).( CollectionChildrenPropertyArrayIndex ) [ CollectionIndex ].( FreezablePropertyArrayIndex )( OwnerPropertyArrayIndex ).( CollectionChildrenPropertyArrayIndex ) [ CollectionIndex ].( FreezablePropertyArrayIndex )

Donde CollectionIndex es el índice del objeto en su matriz o colección.Where CollectionIndex is the index of the object in its array or collection.

Para establecer como Angle destino la propiedad RotateTransformde, TransformGroupla segunda transformación de, usaría los siguientes elementos Path y PathParameters.To target the Angle property of the RotateTransform, the second transform in the TransformGroup, you would use the following Path and PathParameters.

DependencyProperty[] propertyChain =
    new DependencyProperty[]
        {
            Rectangle.RenderTransformProperty, 
            TransformGroup.ChildrenProperty,
            RotateTransform.AngleProperty
        };
string thePath = "(0).(1)[1].(2)";
PropertyPath myPropertyPath = new PropertyPath(thePath, propertyChain);
Storyboard.SetTargetProperty(myDoubleAnimation, myPropertyPath);

En el ejemplo siguiente se muestra el código completo para Angle animar RotateTransform el de un TransformGroupcontenido dentro de un.The following example shows the complete code for animating the Angle of a RotateTransform contained within a TransformGroup.

Rectangle rectangle02 = new Rectangle();
rectangle02.Name = "Rectangle02";
this.RegisterName(rectangle02.Name, rectangle02);
rectangle02.Width = 100;
rectangle02.Height = 100;
rectangle02.Fill = Brushes.Blue;
rectangle02.RenderTransform = 
    (TransformGroup)this.Resources["MyTransformGroupResource"];

DoubleAnimation myDoubleAnimation = new DoubleAnimation();
myDoubleAnimation.From = 0;
myDoubleAnimation.To = 360;
myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(1));
Storyboard.SetTargetName(myDoubleAnimation, rectangle02.Name);

DependencyProperty[] propertyChain =
    new DependencyProperty[]
        {
            Rectangle.RenderTransformProperty, 
            TransformGroup.ChildrenProperty,
            RotateTransform.AngleProperty
        };
string thePath = "(0).(1)[1].(2)";
PropertyPath myPropertyPath = new PropertyPath(thePath, propertyChain);
Storyboard.SetTargetProperty(myDoubleAnimation, myPropertyPath);

Storyboard myStoryboard = new Storyboard();
myStoryboard.Children.Add(myDoubleAnimation);
BeginStoryboard myBeginStoryboard = new BeginStoryboard();
myBeginStoryboard.Storyboard = myStoryboard;
EventTrigger myMouseEnterTrigger = new EventTrigger();
myMouseEnterTrigger.RoutedEvent = Rectangle.MouseEnterEvent;
myMouseEnterTrigger.Actions.Add(myBeginStoryboard);
rectangle02.Triggers.Add(myMouseEnterTrigger);

Establecimiento indirecto de destinos con un objeto inmovilizable como punto de partidaIndirectly Targeting with a Freezable as the Starting Point

En las secciones anteriores se describe cómo establecer como Freezable destino indirectamente un FrameworkElement objeto FrameworkContentElement a partir de un o y crear Freezable una cadena de propiedades a una subpropiedad.The previous sections described how to indirectly target a Freezable by starting with a FrameworkElement or FrameworkContentElement and creating a property chain to a Freezable sub-property. También puede usar Freezable como punto de partida y dirigirse indirectamente a una de Freezable sus subpropiedades.You can also use a Freezable as a starting point and indirectly target one of its Freezable sub-properties. Cuando se usa un Freezable como punto de partida para el establecimiento indirecto de destinos, se aplica una restricción adicional: el inicio Freezable y el de cada uno Freezable de ellos y la subpropiedad de destino indirecta no se deben inmovilizar.One additional restriction applies when using a Freezable as a starting point for indirect targeting: the starting Freezable and every Freezable between it and the indirectly targeted sub-property must not be frozen.

Controlar guiones gráficos de forma interactiva en XAMLInteractively Controlling a Storyboard in XAML

Para iniciar un guion gráfico Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML)en, se usa BeginStoryboard una acción de desencadenador.To start a storyboard in Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML), you use a BeginStoryboard trigger action. BeginStoryboarddistribuye las animaciones a los objetos y propiedades que animan e inicia el guion gráfico.BeginStoryboard distributes the animations to the objects and properties they animate, and starts the storyboard. (Para obtener más información acerca de este proceso, consulte información general sobre el sistema de control de tiempo y animación). Si asigna un nombre BeginStoryboard mediante la especificación de su Name propiedad, lo convierte en un guión gráfico controlable.(For details about this process, see the Animation and Timing System Overview.) If you give the BeginStoryboard a name by specifying its Name property, you make it a controllable storyboard. A continuación, podrá controlar interactivamente el guión gráfico una vez iniciado.You can then interactively control the storyboard after it's started. Esta es una lista de acciones de guión gráfico controlables que se utiliza con desencadenadores de eventos para controlar un guión gráfico.The following is a list of controllable storyboard actions that you use with event triggers to control a storyboard.

En el ejemplo siguiente se utilizan acciones para controlar interactivamente un guión gráfico.In the following example, controllable storyboard actions are used to interactively control a storyboard.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="Microsoft.SDK.Animation.ControllableStoryboardExample"
  WindowTitle="Fading Rectangle Example">
  <StackPanel Margin="10">

    <Rectangle
      Name="MyRectangle"
      Width="100" 
      Height="100"
      Fill="Blue">
    </Rectangle>

    <Button Name="BeginButton">Begin</Button>
    <Button Name="PauseButton">Pause</Button>
    <Button Name="ResumeButton">Resume</Button>
    <Button Name="SkipToFillButton">Skip To Fill</Button>
    <Button Name="StopButton">Stop</Button>

    <StackPanel.Triggers>
      <EventTrigger RoutedEvent="Button.Click" SourceName="BeginButton">
        <BeginStoryboard Name="MyBeginStoryboard">
          <Storyboard>
            <DoubleAnimation
              Storyboard.TargetName="MyRectangle" 
              Storyboard.TargetProperty="(Rectangle.Opacity)"
              From="1.0" To="0.0" Duration="0:0:5" />
          </Storyboard>
        </BeginStoryboard>
      </EventTrigger>
      <EventTrigger RoutedEvent="Button.Click" SourceName="PauseButton">
        <PauseStoryboard BeginStoryboardName="MyBeginStoryboard" />
      </EventTrigger>
      <EventTrigger RoutedEvent="Button.Click" SourceName="ResumeButton">
        <ResumeStoryboard BeginStoryboardName="MyBeginStoryboard" />
      </EventTrigger>
      <EventTrigger RoutedEvent="Button.Click" SourceName="SkipToFillButton">
        <SkipStoryboardToFill BeginStoryboardName="MyBeginStoryboard" />
      </EventTrigger>
      <EventTrigger RoutedEvent="Button.Click" SourceName="StopButton">
        <StopStoryboard BeginStoryboardName="MyBeginStoryboard" />
      </EventTrigger>
    </StackPanel.Triggers>
  </StackPanel>
</Page>

Controlar interactivamente un guión gráfico mediante códigoInteractively Controlling a Storyboard by Using Code

En los ejemplos anteriores se muestra cómo animar mediante acciones de desencadenador.The previous examples have shown how to animate using trigger actions. En el código, también puede controlar un guión gráfico mediante métodos interactivos de la Storyboard clase.In code, you may also control a storyboard using interactive methods of the Storyboard class. Para que Storyboard un se convierta en interactivo en el código, debe usar la sobrecarga adecuada del método Begin del guión gráfico true y especificar para que sea controlable.For a Storyboard to be made interactive in code, you must use the appropriate overload of the storyboard's Begin method and specify true to make it controllable. Vea la Begin(FrameworkElement, Boolean) página para obtener más información.See the Begin(FrameworkElement, Boolean) page for more information.

En la lista siguiente se muestran los métodos que se pueden utilizar para manipular Storyboard una después de que se haya iniciado:The following list shows the methods that can be used to manipulate a Storyboard after it has started:

La ventaja de utilizar estos métodos es que no es necesario crear Trigger objetos o TriggerAction ; solo necesita una Storyboard referencia al objeto controlable que desea manipular.The advantage to using these methods is that you don't need to create Trigger or TriggerAction objects; you just need a reference to the controllable Storyboard you want to manipulate.

Nota

Todas las acciones interactivas Clockrealizadas en un y, por Storyboard lo tanto, también en se producirán en el siguiente paso del motor de control de tiempo, que se producirá poco antes de la siguiente representación.All interactive actions taken on a Clock, and therefore also on a Storyboard will occur on the next tick of the timing engine which will happen shortly before the next render. Por ejemplo, si usa el Seek método para saltar a otro punto de una animación, el valor de la propiedad no cambia al instante, sino que el valor cambia en el siguiente paso del motor de control de tiempo.For example, if you use the Seek method to jump to another point in an animation, the property value does not change instantly, rather, the value changes on the next tick of the timing engine.

En el ejemplo siguiente se muestra cómo aplicar y controlar animaciones mediante los métodos interactivos de la Storyboard clase.The following example shows how to apply and control animations using the interactive methods of the Storyboard class.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media;
using System.Windows.Media.Animation;

namespace SDKSample
{

    public class ControllableStoryboardExample : Page
    {
        private Storyboard myStoryboard;

        public ControllableStoryboardExample()
        {

            // Create a name scope for the page.

            NameScope.SetNameScope(this, new NameScope()); 
 
            this.WindowTitle = "Controllable Storyboard Example";
            StackPanel myStackPanel = new StackPanel();
            myStackPanel.Margin = new Thickness(10);

            // Create a rectangle.
            Rectangle myRectangle = new Rectangle();
            myRectangle.Name = "myRectangle";

            // Assign the rectangle a name by 
            // registering it with the page, so that
            // it can be targeted by storyboard
            // animations.
            this.RegisterName(myRectangle.Name, myRectangle);
            myRectangle.Width = 100;
            myRectangle.Height = 100;
            myRectangle.Fill = Brushes.Blue;
            myStackPanel.Children.Add(myRectangle);

            //
            // Create an animation and a storyboard to animate the
            // rectangle.
            //
            DoubleAnimation myDoubleAnimation = new DoubleAnimation();
            myDoubleAnimation.From = 1.0;
            myDoubleAnimation.To = 0.0;
            myDoubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(5000));
            myDoubleAnimation.AutoReverse = true;

            // Create the storyboard.
            myStoryboard = new Storyboard();
            myStoryboard.Children.Add(myDoubleAnimation);
            Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);
            Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(Rectangle.OpacityProperty));

            //
            // Create some buttons to control the storyboard
            // and a panel to contain them.
            //
            StackPanel buttonPanel = new StackPanel();
            buttonPanel.Orientation = Orientation.Horizontal;
            Button beginButton = new Button();
            beginButton.Content = "Begin";
            beginButton.Click += new RoutedEventHandler(beginButton_Clicked);
            buttonPanel.Children.Add(beginButton);
            Button pauseButton = new Button();
            pauseButton.Content = "Pause";
            pauseButton.Click += new RoutedEventHandler(pauseButton_Clicked);
            buttonPanel.Children.Add(pauseButton);
            Button resumeButton = new Button();
            resumeButton.Content = "Resume";
            resumeButton.Click += new RoutedEventHandler(resumeButton_Clicked);
            buttonPanel.Children.Add(resumeButton);
            Button skipToFillButton = new Button();
            skipToFillButton.Content = "Skip to Fill";
            skipToFillButton.Click += new RoutedEventHandler(skipToFillButton_Clicked);
            buttonPanel.Children.Add(skipToFillButton);
            Button setSpeedRatioButton = new Button();
            setSpeedRatioButton.Content = "Triple Speed";
            setSpeedRatioButton.Click += new RoutedEventHandler(setSpeedRatioButton_Clicked);
            buttonPanel.Children.Add(setSpeedRatioButton);
            Button stopButton = new Button();
            stopButton.Content = "Stop";
            stopButton.Click += new RoutedEventHandler(stopButton_Clicked);
            buttonPanel.Children.Add(stopButton);
            myStackPanel.Children.Add(buttonPanel);
            this.Content = myStackPanel;        
            

        }

        // Begins the storyboard.
        private void beginButton_Clicked(object sender, RoutedEventArgs args)
        {
            // Specifying "true" as the second Begin parameter
            // makes this storyboard controllable.
            myStoryboard.Begin(this, true);

        }

        // Pauses the storyboard.
        private void pauseButton_Clicked(object sender, RoutedEventArgs args)
        {
            myStoryboard.Pause(this);

        }

        // Resumes the storyboard.
        private void resumeButton_Clicked(object sender, RoutedEventArgs args)
        {
            myStoryboard.Resume(this);

        }

        // Advances the storyboard to its fill period.
        private void skipToFillButton_Clicked(object sender, RoutedEventArgs args)
        {
            myStoryboard.SkipToFill(this);

        }

        // Updates the storyboard's speed.
        private void setSpeedRatioButton_Clicked(object sender, RoutedEventArgs args)
        {
            // Makes the storyboard progress three times as fast as normal.
            myStoryboard.SetSpeedRatio(this, 3);

        }

        // Stops the storyboard.
        private void stopButton_Clicked(object sender, RoutedEventArgs args)
        {
            myStoryboard.Stop(this);

        }         

    }

}

Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Shapes
Imports System.Windows.Media
Imports System.Windows.Media.Animation

Namespace SDKSample

    Public Class ControllableStoryboardExample
        Inherits Page
        Private myStoryboard As Storyboard

        Public Sub New()

            ' Create a name scope for the page.

            NameScope.SetNameScope(Me, New NameScope())

            Me.WindowTitle = "Controllable Storyboard Example"
            Dim myStackPanel As New StackPanel()
            myStackPanel.Margin = New Thickness(10)

            ' Create a rectangle.
            Dim myRectangle As New Rectangle()
            myRectangle.Name = "myRectangle"

            ' Assign the rectangle a name by 
            ' registering it with the page, so that
            ' it can be targeted by storyboard
            ' animations.
            Me.RegisterName(myRectangle.Name, myRectangle)
            myRectangle.Width = 100
            myRectangle.Height = 100
            myRectangle.Fill = Brushes.Blue
            myStackPanel.Children.Add(myRectangle)

            '
            ' Create an animation and a storyboard to animate the
            ' rectangle.
            '
            Dim myDoubleAnimation As New DoubleAnimation()
            myDoubleAnimation.From = 1.0
            myDoubleAnimation.To = 0.0
            myDoubleAnimation.Duration = New Duration(TimeSpan.FromMilliseconds(5000))
            myDoubleAnimation.AutoReverse = True

            ' Create the storyboard.
            myStoryboard = New Storyboard()
            myStoryboard.Children.Add(myDoubleAnimation)
            Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name)
            Storyboard.SetTargetProperty(myDoubleAnimation, New PropertyPath(Rectangle.OpacityProperty))

            '
            ' Create some buttons to control the storyboard
            ' and a panel to contain them.
            '
            Dim buttonPanel As New StackPanel()
            buttonPanel.Orientation = Orientation.Horizontal
            Dim beginButton As New Button()
            beginButton.Content = "Begin"
            AddHandler beginButton.Click, AddressOf beginButton_Clicked
            buttonPanel.Children.Add(beginButton)
            Dim pauseButton As New Button()
            pauseButton.Content = "Pause"
            AddHandler pauseButton.Click, AddressOf pauseButton_Clicked
            buttonPanel.Children.Add(pauseButton)
            Dim resumeButton As New Button()
            resumeButton.Content = "Resume"
            AddHandler resumeButton.Click, AddressOf resumeButton_Clicked
            buttonPanel.Children.Add(resumeButton)
            Dim skipToFillButton As New Button()
            skipToFillButton.Content = "Skip to Fill"
            AddHandler skipToFillButton.Click, AddressOf skipToFillButton_Clicked
            buttonPanel.Children.Add(skipToFillButton)
            Dim setSpeedRatioButton As New Button()
            setSpeedRatioButton.Content = "Triple Speed"
            AddHandler setSpeedRatioButton.Click, AddressOf setSpeedRatioButton_Clicked
            buttonPanel.Children.Add(setSpeedRatioButton)
            Dim stopButton As New Button()
            stopButton.Content = "Stop"
            AddHandler stopButton.Click, AddressOf stopButton_Clicked
            buttonPanel.Children.Add(stopButton)
            myStackPanel.Children.Add(buttonPanel)
            Me.Content = myStackPanel


        End Sub

        ' Begins the storyboard.
        Private Sub beginButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            ' Specifying "true" as the second Begin parameter
            ' makes this storyboard controllable.
            myStoryboard.Begin(Me, True)

        End Sub

        ' Pauses the storyboard.
        Private Sub pauseButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            myStoryboard.Pause(Me)

        End Sub

        ' Resumes the storyboard.
        Private Sub resumeButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            myStoryboard.Resume(Me)

        End Sub

        ' Advances the storyboard to its fill period.
        Private Sub skipToFillButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            myStoryboard.SkipToFill(Me)

        End Sub

        ' Updates the storyboard's speed.
        Private Sub setSpeedRatioButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            ' Makes the storyboard progress three times as fast as normal.
            myStoryboard.SetSpeedRatio(Me, 3)

        End Sub

        ' Stops the storyboard.
        Private Sub stopButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            myStoryboard.Stop(Me)

        End Sub

    End Class

End Namespace

Animar en un estiloAnimate in a Style

Puede utilizar Storyboard objetos para definir animaciones en un Style.You can use Storyboard objects to define animations in a Style. Animar con Storyboard un en Style un es similar a usar Storyboard un en otra parte, con las tres excepciones siguientes:Animating with a Storyboard in a Style is similar to using a Storyboard elsewhere, with the following three exceptions:

  • No se especifica un TargetName Storyboard ; siempre tiene como destino Style el elemento al que se aplica.You don't specify a TargetName; the Storyboard always targets the element to which the Style is applied. Para los Freezable objetos de destino, debe utilizar el establecimiento indirecto de destinos.To target Freezable objects, you must use indirect targeting. Para obtener más información sobre el establecimiento indirecto de destinos, consulte la sección de destinatarios indirectos .For more information about indirect targeting, see the Indirect Targeting section.

  • No se puede especificar SourceName un para EventTrigger un o Triggerun.You can't specify a SourceName for an EventTrigger or a Trigger.

  • No se pueden usar referencias de recursos dinámicos o expresiones de Storyboard enlace de datos para establecer o animar los valores de propiedad.You can't use dynamic resource references or data binding expressions to set Storyboard or animation property values. Esto se debe a que todo Style lo que hay dentro de debe ser seguro para subprocesos y el sistema de control de tiempo debe Freeze Storyboard ser objeto para hacerlos seguros para subprocesos.That's because everything inside a Style must be thread-safe, and the timing system must FreezeStoryboard objects to make them thread-safe. No Storyboard se puede inmovilizar si o sus escalas de tiempo secundarias contienen referencias de recursos dinámicos o expresiones de enlace de datos.A Storyboard cannot be frozen if it or its child timelines contain dynamic resource references or data binding expressions. Para obtener más información sobre la inmovilización y otras Freezable características, consulte la información general sobre objetos Freezable.For more information about freezing and other Freezable features, see the Freezable Objects Overview.

  • En XAMLXAML, no se pueden declarar controladores de eventos Storyboard para eventos de animación o.In XAMLXAML, you can't declare event handlers for Storyboard or animation events.

Para ver un ejemplo en el que se muestra cómo definir un guion gráfico en un estilo, vea el ejemplo de animar en un estilo .For an example showing how to define a storyboard in a style, see the Animate in a Style example.

Animar en un ControlTemplateAnimate in a ControlTemplate

Puede utilizar Storyboard objetos para definir animaciones en un ControlTemplate.You can use Storyboard objects to define animations in a ControlTemplate. Animar con Storyboard un en ControlTemplate un es similar a usar Storyboard un en otra parte, con las dos excepciones siguientes:Animating with a Storyboard in a ControlTemplate is similar to using a Storyboard elsewhere, with the following two exceptions:

Para ver un ejemplo en el que se muestra cómo definir ControlTemplateun guion gráfico en un, vea el ejemplo de animar en un ControlTemplate .For an example showing how to define a storyboard in a ControlTemplate, see the Animate in a ControlTemplate example.

Animar cuando cambia el valor de una propiedadAnimate When a Property Value Changes

En estilos y plantillas de control, puede utilizar objetos Trigger para iniciar un guión gráfico cuando cambia una propiedad.In styles and control templates, you can use Trigger objects to start a storyboard when a property changes. Para obtener ejemplos, vea desencadenar una animación cuando cambia el valor de una propiedad y animar en un ControlTemplate.For examples, see Trigger an Animation When a Property Value Changes and Animate in a ControlTemplate.

Las animaciones aplicadas Trigger por objetos de propiedad se comportan EventTrigger de manera más compleja que las animaciones o animaciones que se inician mediante Storyboard métodos.Animations applied by property Trigger objects behave in a more complex fashion than EventTrigger animations or animations started using Storyboard methods. "Se colocan" con animaciones definidas Trigger por otros objetos, pero EventTrigger se componen con y animaciones desencadenadas por el método.They "handoff" with animations defined by other Trigger objects, but compose with EventTrigger and method-triggered animations.

Vea tambiénSee also