Общие сведения о StoryboardStoryboards Overview

В этом разделе показано, как использовать Storyboard объектов для создания и применения анимаций.This topic shows how to use Storyboard objects to organize and apply animations. Он описывает, как интерактивно манипулировать Storyboard объектов и описывает синтаксис косвенного выбора свойств.It describes how to interactively manipulate Storyboard objects and describes indirect property targeting syntax.

Предварительные требованияPrerequisites

Для понимания этого раздела необходимо ознакомиться с различными типами анимации и их основными возможностями.To understand this topic, you should be familiar with the different animation types and their basic features. Общие сведения об анимации см. в разделе Общие сведения об эффектах анимации.For an introduction to animation, see the Animation Overview. Вы также должны знать, как использовать вложенные свойства.You should also know how to use attached properties. Дополнительные сведения о вложенных свойствах см. в разделах Общие сведения о вложенных свойствах.For more information about attached properties, see the Attached Properties Overview.

Что такое раскадровка?What Is a Storyboard?

Анимация — не единственный удобный тип временной шкалы.Animations are not the only useful type of timeline. Существуют другие классы временной шкалы, с помощью которых вы сможете создать наборы временных шкал и применить временные шкалы к свойствам.Other timeline classes are provided to help you organize sets of timelines, and to apply timelines to properties. Временные шкалы контейнера являются производными от TimelineGroup класса и включать ParallelTimeline и Storyboard.Container timelines derive from the TimelineGroup class, and include ParallelTimeline and Storyboard.

Объект Storyboard — это тип временной шкалы контейнера, который содержит сведения для временных шкал, он содержит.A Storyboard is a type of container timeline that provides targeting information for the timelines it contains. Раскадровка может содержать любой тип Timeline, включая другие временные шкалы контейнера и анимации.A Storyboard can contain any type of Timeline, including other container timelines and animations. Storyboard объекты позволяют объединять временные шкалы, которые влияют на различные объекты и свойства в одно дерево временной шкалы, упрощая организацию и управление сложным поведением времени.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. Например, предположим, что вам необходима кнопка, которая выполняет следующие три действия.For example, suppose you want a button that does these three things.

  • Увеличивается и изменяет цвет, когда пользователь выбирает кнопку.Grow and change color when the user selects the button.

  • Сжимается, а затем увеличивается до исходного размера, когда пользователь нажимает на кнопку.Shrink away and then grow back to its original size when clicked.

  • Сжимается и изменяет яркость до 50-процентной прозрачности, если кнопка становится недоступной.Shrink and fade to 50 percent opacity when it becomes disabled.

В этом случае у вас есть несколько наборов анимаций, которые применяются к одному объекту и которые требуется воспроизводить в разное время в зависимости от состояния кнопки.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. Storyboard объекты позволяют упорядочить анимации и применить их в группах для одного или нескольких объектов.Storyboard objects enable you to organize animations and apply them in groups to one or more objects.

Где можно использовать раскадровку?Where Can You Use a Storyboard?

Объект Storyboard может использоваться для анимации свойства зависимостей анимируемых классов (Дополнительные сведения о том, что делает класс анимируемым, см. в разделе Общие сведения об анимации).A Storyboard can be used to animate dependency properties of animatable classes (for more information about what makes a class animatable, see the Animation Overview). Однако поскольку раскадровка является функцией уровня платформы, объект должен принадлежать к NameScope из FrameworkElement или FrameworkContentElement.However, because storyboarding is a framework-level feature, the object must belong to the NameScope of a FrameworkElement or a FrameworkContentElement.

Например, можно использовать Storyboard для следующих целей:For example, you could use a Storyboard to do the following:

Тем не менее, невозможно использовать Storyboard для анимации SolidColorBrush , не зарегистрировало его именем FrameworkElement или FrameworkContentElement, или который не использовался, чтобы задать свойство FrameworkElement или FrameworkContentElement.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.

Применение анимации с помощью раскадровкиHow to Apply Animations with a Storyboard

Чтобы использовать Storyboard для создания и применения анимаций, можно добавить анимации в качестве дочерних временных шкал объекта Storyboard.To use a Storyboard to organize and apply animations, you add the animations as child timelines of the Storyboard. Storyboard Класс предоставляет Storyboard.TargetName и Storyboard.TargetProperty присоединенных свойств.The Storyboard class provides the Storyboard.TargetName and Storyboard.TargetProperty attached properties. Эти свойства используются для указания целевого объекта и целевого свойства анимации.You set these properties on an animation to specify its target object and property.

Чтобы применить анимацию к целевым объектам, началом Storyboard с помощью действия триггера или метода.To apply animations to their targets, you begin the Storyboard using a trigger action or a method. В XAMLXAML, использовании BeginStoryboard со EventTrigger, Trigger, или DataTrigger.In XAMLXAML, you use a BeginStoryboard object with an EventTrigger, Trigger, or DataTrigger. В коде, можно также использовать Begin метод.In code, you can also use the Begin method.

В следующей таблице показаны различные где каждого Storyboard начать прием поддерживается: для каждого экземпляра, стиль, шаблон элемента управления и шаблон данных.The following table shows the different places where each Storyboard begin technique is supported: per-instance, style, control template, and data template. Применение к конкретным экземплярам подразумевает применение анимации или раскадровки непосредственно к экземплярам объектов, а не в стилях, шаблонах элементов управления или шаблонах данных."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.

Раскадровка запускается с помощью метода...Storyboard is begun using… Применение к конкретным экземплярамPer-instance СтильStyle Шаблон элемента управленияControl template Шаблон данныхData template ПримерExample
BeginStoryboard и EventTriggerBeginStoryboard and an EventTrigger ДаYes ДаYes ДаYes ДаYes Анимация свойства с помощью раскадровкиAnimate a Property by Using a Storyboard
BeginStoryboard и свойство TriggerBeginStoryboard and a property Trigger НетNo ДаYes ДаYes ДаYes Запуск анимации при изменении значения свойстваTrigger an Animation When a Property Value Changes
BeginStoryboard и DataTriggerBeginStoryboard and a DataTrigger НетNo ДаYes ДаYes ДаYes Практическое руководство. Запуск анимации при изменении данныхHow to: Trigger an Animation When Data Changes
Метод BeginBegin method ДаYes НетNo НетNo НетNo Анимация свойства с помощью раскадровкиAnimate a Property by Using a Storyboard

В следующем примере используется Storyboard для анимации Width из Rectangle элемент и Color из SolidColorBrush используется для рисования Rectangle.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;
        } 
    }
}

В следующих разделах описываются TargetName и TargetProperty присоединенных свойств более подробно.The following sections describe the TargetName and TargetProperty attached properties in more detail.

Элементы целевой платформы, элементы содержимого платформы и объекты FreezableTargeting Framework Elements, Framework Content Elements, and Freezables

В предыдущем разделе упоминалось, что для поиска целевого объекта анимации необходимо знать имя целевого объекта и анимируемое свойство.The previous section mentioned that, for an animation to find its target, it must know the target's name and the property to animate. Указание свойства для анимации выполняется очень легко: просто задайте Storyboard.TargetProperty именем анимируемое свойство.Specifying the property to animate is straight forward: simply set Storyboard.TargetProperty with the name of the property to animate. Укажите имя объекта, свойство которого вы хотите анимировать, установив Storyboard.TargetName свойство анимации.You specify the name of the object whose property you want to animate by setting the Storyboard.TargetName property on the animation.

Для TargetName работы свойства целевого объекта должен иметь имя.For the TargetName property to work, the targeted object must have a name. Назначение имени для FrameworkElement или FrameworkContentElement в XAMLXAML отличается от присваивания имени Freezable объекта.Assigning a name to a FrameworkElement or a FrameworkContentElement in XAMLXAML is different than assigning a name to a Freezable object.

Элементами платформы являются классы, наследующие от FrameworkElement класса.Framework elements are those classes that inherit from the FrameworkElement class. Примеры элементов платформы включают Window, DockPanel, Button, и Rectangle.Examples of framework elements include Window, DockPanel, Button, and Rectangle. По существу все окна, панели и элементы управления являются элементами.Essentially all windows, panels, and controls are elements. Элементами содержимого платформы являются классы, наследующие от FrameworkContentElement класса.Framework content elements are those classes that inherit from the FrameworkContentElement class. Примеры элементов содержимого платформы включают FlowDocument и Paragraph.Examples of framework content elements include FlowDocument and Paragraph. Если вы не уверены, что этот элемент является элементом платформы или элементом содержимого платформы, проверьте, есть ли у этого элемента свойство 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. Если есть, скорее всего, это элемент платформы или элемент содержимого платформы.If it does, it's probably a framework element or a framework content element. Чтобы убедиться в этом, обратитесь к разделу "Иерархия наследования" на странице типа элемента.To be sure, check the Inheritance Hierarchy section of its type page.

Чтобы включить целевые элементом платформы или элемента содержимого платформы в XAMLXAML, можно задать его Name свойство.To enable the targeting of a framework element or a framework content element in XAMLXAML, you set its Name property. В коде, необходимо также использовать RegisterName метод, чтобы зарегистрировать имя элемента в элементе, для которого вы создали NameScope.In 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.

В следующем примере, взятом из предыдущего примера, назначает имя MyRectangle Rectangle, тип 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);

После того как элемент получил имя, вы можете анимировать свойство этого элемента.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));

Freezable типы являются классы, наследующие от Freezable класса.Freezable types are those classes that inherit from the Freezable class. Примеры Freezable включают SolidColorBrush, RotateTransform, и GradientStop.Examples of Freezable include SolidColorBrush, RotateTransform, and GradientStop.

Чтобы включить целевые Freezable с помощью анимации в XAMLXAML, использовании директива x: Name присвоить имя.To enable the targeting of a Freezable by an animation in XAMLXAML, you use the x:Name Directive to assign it a name. В коде используйте RegisterName метод для регистрации имени элемента, для которого вы создали NameScope.In code, you use the RegisterName method to register its name with the element for which you've created a NameScope.

В следующем примере назначается имя, Freezable объекта.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);

Затем этот объект можно выбрать в качестве целевого с помощью анимации.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)); 

Storyboard объекты используются области видимости имен для разрешения TargetName свойство.Storyboard objects use name scopes to resolve the TargetName property. Дополнительные сведения об областях видимости имен WPF см. в разделе Области видимости имен XAML в WPF.For more information about WPF name scopes, see WPF XAML Namescopes. Если TargetName свойства указан, элемент, на котором она была определена, или, в случае стили, оформленного элемент целевым объектом для анимации.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.

Иногда имя не может быть назначен Freezable объекта.Sometimes a name can't be assigned to a Freezable object. Например если Freezable объявлен как ресурс или используется для задания значения свойства в стиле, ему нельзя присвоить имя.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. Так как у объекта нет имени, к нему нельзя обратиться напрямую, но можно обратиться косвенно.Because it doesn't have a name, it can't be targeted directly—but it can be targeted indirectly. В следующих разделах описано, как обращаться к целевым объектам косвенно.The following sections describe how to use indirect targeting.

Косвенное обращениеIndirect Targeting

Иногда Freezable не может применяться непосредственно с помощью анимации, например, при Freezable объявлен как ресурс или используется для задания значения свойства в стиле.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. В таких случаях, несмотря на то, что вы не можете выбрать напрямую, можно анимировать Freezable объекта.In these cases, even though you can't target it directly, you can still animate the Freezable object. Вместо того чтобы задавать TargetName свойство с именем Freezable, присвойте ему имя элемента, к которому Freezable «принадлежит».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." Например SolidColorBrush присваивается Fill прямоугольника элемент принадлежит этому прямоугольника.For example, a SolidColorBrush used to set the Fill of a rectangle element belongs to that rectangle. Чтобы анимировать кисть, необходимо установить анимации TargetProperty в цепи свойства, которое начинается с свойство элемента платформы или элемента содержимого платформы Freezable использовалась для установки и заканчивается Freezable анимируемое свойство.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);

Обратите внимание, что, если Freezable является фиксированной, будет создан клон и этот клон будет анимироваться.Note that, if the Freezable is frozen, a clone will be made, and that clone will be animated. Если это происходит, исходный объект HasAnimatedProperties свойство продолжает возвращать false, так как исходный объект фактически не анимируется.When this happens, the original object's HasAnimatedProperties property continues to return false, because the original object is not actually animated. Дополнительные сведения о клонировании см. в разделе Freezable Общие сведения об объектах.For more information about cloning, see the Freezable Objects Overview.

Обратите внимание, что при косвенном обращении к целевым объектам можно обращаться к объектам, которых не существует.Also note that, when using indirect property targeting, it's possible to target objects that don't exist. Например, можно предположить, что Background для конкретной кнопки было установлено с помощью SolidColorBrush и попробуете анимировать его свойство Color, когда на самом деле LinearGradientBrush использовалась для установки фона кнопки.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. В этих случаях исключение не вызывается; анимация не имеет видимого эффекта, так как LinearGradientBrush не реагирует на изменения в Color свойство.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.

В следующих разделах более подробно описан синтаксис косвенного обращения к целевым объектам.The following sections describe indirect property targeting syntax in more detail.

Косвенное обращение к свойству объекта Freezable в XAMLIndirectly Targeting a Property of a Freezable in XAML

Чтобы обратиться к свойству объекта freezable в XAMLXAML, используйте следующий синтаксис.To target a property of a freezable in XAMLXAML, use the following syntax.

ElementPropertyName . FreezablePropertyNameElementPropertyName . FreezablePropertyName

WhereWhere

  • ElementPropertyName свойство FrameworkElement которого Freezable используется для задания, иElementPropertyName is the property of the FrameworkElement which the Freezable is used to set, and

  • FreezablePropertyName свойство Freezable для анимации.FreezablePropertyName is the property of the Freezable to animate.

Ниже показано, как анимировать Color из SolidColorBrush используемый для заданияThe following code shows how to animate the Color of a SolidColorBrush used to set the

Fill элемента прямоугольника.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>

Иногда требуется обратиться к объекту Freezable, который содержится в коллекции или массиве.Sometimes you need to target a freezable contained in a collection or array.

Чтобы обратиться к объекту Freezable, который содержится в коллекции, используйте следующий синтаксис пути.To target a freezable contained in a collection, you use the following path syntax.

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

Где CollectionIndex — индекс объекта в массиве или коллекции.Where CollectionIndex is the index of the object in its array or collection.

Например, предположим, что у прямоугольника есть TransformGroup ресурс, применяемый к его RenderTransform свойство и вы хотите анимировать одно из преобразований, он содержит.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>

Ниже показано, как анимировать Angle свойство RotateTransform показано в предыдущем примере.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>  

Косвенное обращение к свойству объекта Freezable в кодеIndirectly Targeting a Property of a Freezable in Code

В коде создайте PropertyPath объекта.In code, you create a PropertyPath object. При создании PropertyPath, указать Path и PathParameters.When you create the PropertyPath, you specify a Path and PathParameters.

Чтобы создать PathParameters, необходимо создать массив типа DependencyProperty , содержащий список поля идентификаторов свойств зависимостей.To create PathParameters, you create an array of type DependencyProperty that contains a list of dependency property identifier fields. — Первое поле идентификатора свойства FrameworkElement или FrameworkContentElement , Freezable используется для задания.The first identifier field is for the property of the FrameworkElement or FrameworkContentElement that the Freezable is used to set. Следующее поле идентификатора представляет свойство Freezable к целевому объекту.The next identifier field represents the property of the Freezable to target. Представьте себе, как цепочку свойств, который подключается Freezable для FrameworkElement объекта.Think of it as a chain of properties that connects the Freezable to the FrameworkElement object.

Ниже приведен пример цепочки свойств зависимостей, предназначенное Color из SolidColorBrush присваивается Fill элемента прямоугольника.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};

Необходимо также указать Path.You also need to specify a Path. Объект PathString , сообщающий Path как интерпретировать его PathParameters.A Path is a String that tells the Path how to interpret its PathParameters. Для этого используется следующий синтаксис.It uses the following syntax.

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

WhereWhere

  • OwnerPropertyArrayIndex — это индекс DependencyProperty массив, содержащий идентификатор FrameworkElement свойство объекта, Freezable используется для задания, иOwnerPropertyArrayIndex 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 — это индекс DependencyProperty массив, содержащий идентификатор свойства к целевому объекту.FreezablePropertyArrayIndex is the index of the DependencyProperty array that contains the identifier of property to target.

В следующем примере показан Path , будет сопровождать PathParameters определенный в предыдущем примере.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)";

В следующем примере объединяются кода в предыдущих примерах для анимации Color из SolidColorBrush присваивается Fill элемента прямоугольника.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);

Иногда требуется обратиться к объекту Freezable, который содержится в коллекции или массиве.Sometimes you need to target a freezable contained in a collection or array. Например, предположим, что у прямоугольника есть TransformGroup ресурс, применяемый к его RenderTransform свойство и вы хотите анимировать одно из преобразований, он содержит.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>  

Целевой объект Freezable содержится в коллекции, используйте следующий синтаксис пути.To target a Freezable contained in a collection, you use the following path syntax.

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

Где CollectionIndex — индекс объекта в массиве или коллекции.Where CollectionIndex is the index of the object in its array or collection.

Целевой объект Angle свойство RotateTransform, во втором преобразовании в TransformGroup, следует ввести следующую Path и 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);

В примере показан полный код для анимации Angle из RotateTransform внутри TransformGroup.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);

Косвенное обращение с использованием объекта Freezable в качестве начальной точкиIndirectly Targeting with a Freezable as the Starting Point

Предыдущих разделах мы описали косвенное обращение к Freezable , начав с FrameworkElement или FrameworkContentElement и создав цепочку свойств до Freezable подчиненных свойств.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. Можно также использовать Freezable качестве отправной точки и косвенно обращаться к одному из его Freezable подсвойства.You can also use a Freezable as a starting point and indirectly target one of its Freezable sub-properties. Одно дополнительное ограничение применяется при использовании Freezable отправной точки для косвенного: начальный Freezable и каждый Freezable не должны фиксироваться между ним и косвенно целевых подчиненных свойств.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.

Интерактивное управление раскадровкой в XAMLInteractively Controlling a Storyboard in XAML

Чтобы запустить раскадровку Язык XAMLExtensible Application Markup Language (XAML), использовании BeginStoryboard запуска действия.To start a storyboard in Язык XAMLExtensible Application Markup Language (XAML), you use a BeginStoryboard trigger action. BeginStoryboard распределяет анимации объектов и свойств и запускает раскадровку.BeginStoryboard distributes the animations to the objects and properties they animate, and starts the storyboard. (Дополнительные сведения об этом процессе см. в разделе анимации и общие сведения о характере системы.) Если вы предоставите BeginStoryboard имя, указав его Name свойство, можно упростить управляемой раскадровки.(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. Вы можете затем интерактивно управлять раскадровкой после ее запуска.You can then interactively control the storyboard after it's started. Ниже приведен список действий для управляемой раскадровки, которые используются совместно с триггерами событий для управления раскадровкой.The following is a list of controllable storyboard actions that you use with event triggers to control a storyboard.

В следующем примере показано использование действий для интерактивного управления раскадровкой.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>

Интерактивное управление раскадровкой с помощью кодаInteractively Controlling a Storyboard by Using Code

В предыдущих примерах было показано, как анимировать свойства с помощью действий триггера.The previous examples have shown how to animate using trigger actions. В коде, можно также управлять раскадровкой с помощью интерактивных методов класса Storyboard класса.In code, you may also control a storyboard using interactive methods of the Storyboard class. Для Storyboard чтобы сделать интерактивными в коде, необходимо использовать соответствующую перегрузку раскадровки Begin метод и указать true чтобы сделать раскадровку управляемой.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. См. в разделе Begin(FrameworkElement, Boolean) дополнительную информацию.See the Begin(FrameworkElement, Boolean) page for more information.

В следующем списке приведены методы, которые можно использовать для управления Storyboard после ее запуска:The following list shows the methods that can be used to manipulate a Storyboard after it has started:

С помощью этих методов удобен тем, что не нужно создавать Trigger или TriggerAction объектов; нужна ссылка на управляемый Storyboard требуется работать.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.

Примечание. Все интерактивные действия, выполняемые Clockи поэтому на Storyboard произойдет при следующем такте, который произойдет незадолго перед следующей операцией рендеринга.Note: 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. Например, если вы используете Seek метод для перехода к следующей точке анимации, значение свойства не изменится сразу же, вместо этого изменяется значение при следующем такте.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.

Приведенный ниже показано, как применять анимации с помощью интерактивных методов класса и управлять Storyboard класса.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 Microsoft.VisualBasic
Imports System
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

Анимация с использованием стилейAnimate in a Style

Можно использовать Storyboard объектов для определения анимаций в Style.You can use Storyboard objects to define animations in a Style. Анимации с помощью Storyboard в Style похоже на использование Storyboard в другом месте, со следующими тремя исключениями:Animating with a Storyboard in a Style is similar to using a Storyboard elsewhere, with the following three exceptions:

  • Вы не укажете TargetName; Storyboard всегда указывает элемент, к которому Style применяется.You don't specify a TargetName; the Storyboard always targets the element to which the Style is applied. Целевой объект Freezable объекты, следует использовать косвенное обращение.To target Freezable objects, you must use indirect targeting. Дополнительные сведения о косвенном обращении см. в разделе косвенное обращение раздел.For more information about indirect targeting, see the Indirect Targeting section.

  • Нельзя указать SourceName для EventTrigger или Trigger.You can't specify a SourceName for an EventTrigger or a Trigger.

  • Нельзя использовать динамический ресурс ссылки или выражения привязки данных для задания Storyboard или значений свойств анимации.You can't use dynamic resource references or data binding expressions to set Storyboard or animation property values. Это потому, что весь код внутри Style должен быть поточно ориентированными, и система управления должна Freeze Storyboard объектов, чтобы сделать их потокобезопасными.That's because everything inside a Style must be thread-safe, and the timing system must FreezeStoryboard objects to make them thread-safe. Объект Storyboard нельзя зафиксировать, если его или ее дочерние временные шкалы содержат динамические ресурсы ссылки или выражения привязки данных.A Storyboard cannot be frozen if it or its child timelines contain dynamic resource references or data binding expressions. Дополнительные сведения о фиксации и других Freezable функции, см. в разделе Freezable Общие сведения об объектах.For more information about freezing and other Freezable features, see the Freezable Objects Overview.

  • В XAMLXAML, нельзя объявлять обработчики событий для Storyboard или событий анимации.In XAMLXAML, you can't declare event handlers for Storyboard or animation events.

Пример, показывающий, как определить раскадровку в стиле, см. в разделе анимация с использованием стилей пример.For an example showing how to define a storyboard in a style, see the Animate in a Style example.

Анимация в ControlTemplateAnimate in a ControlTemplate

Можно использовать Storyboard объектов для определения анимаций в ControlTemplate.You can use Storyboard objects to define animations in a ControlTemplate. Анимации с помощью Storyboard в ControlTemplate похоже на использование Storyboard в другом месте, со следующими двумя исключениями:Animating with a Storyboard in a ControlTemplate is similar to using a Storyboard elsewhere, with the following two exceptions:

  • TargetName Могут ссылаться только на дочерние объекты ControlTemplate.The TargetName may only refer to child objects of the ControlTemplate. Если TargetName не указан, элемент, в который целевым объектом для анимации ControlTemplate применяется.If TargetName is not specified, the animation targets the element to which the ControlTemplate is applied.

  • SourceName Для EventTrigger или Trigger могут ссылаться только на дочерние объекты ControlTemplate.The SourceName for an EventTrigger or a Trigger may only refer to child objects of the ControlTemplate.

  • Нельзя использовать динамический ресурс ссылки или выражения привязки данных для задания Storyboard или значений свойств анимации.You can't use dynamic resource references or data binding expressions to set Storyboard or animation property values. Это потому, что весь код внутри ControlTemplate должен быть поточно ориентированными, и система управления должна Freeze Storyboard объектов, чтобы сделать их потокобезопасными.That's because everything inside a ControlTemplate must be thread-safe, and the timing system must FreezeStoryboard objects to make them thread-safe. Объект Storyboard нельзя зафиксировать, если его или ее дочерние временные шкалы содержат динамические ресурсы ссылки или выражения привязки данных.A Storyboard cannot be frozen if it or its child timelines contain dynamic resource references or data binding expressions. Дополнительные сведения о фиксации и других Freezable функции, см. в разделе Freezable Общие сведения об объектах.For more information about freezing and other Freezable features, see the Freezable Objects Overview.

  • В XAMLXAML, нельзя объявлять обработчики событий для Storyboard или событий анимации.In XAMLXAML, you can't declare event handlers for Storyboard or animation events.

Пример, показывающий, как определить раскадровку в ControlTemplate, см. в разделе анимация в ControlTemplate пример.For an example showing how to define a storyboard in a ControlTemplate, see the Animate in a ControlTemplate example.

Анимация при изменении значения свойстваAnimate When a Property Value Changes

В стилях и шаблонах элементов можно использовать объекты триггеров для запуска раскадровки при изменении свойства.In styles and control templates, you can use Trigger objects to start a storyboard when a property changes. Примеры, см. в разделе триггер анимации при изменении значения свойства и анимация в ControlTemplate.For examples, see Trigger an Animation When a Property Value Changes and Animate in a ControlTemplate.

Анимации с помощью свойства Trigger объекты ведут себя в сложнее, чем EventTrigger анимации или анимации к использованию Storyboard методы.Animations applied by property Trigger objects behave in a more complex fashion than EventTrigger animations or animations started using Storyboard methods. Они «переходной» с анимацией определены другими Trigger объектов, но compose с EventTrigger и анимациями, запускаемыми.They "handoff" with animations defined by other Trigger objects, but compose with EventTrigger and method-triggered animations.

См. такжеSee also