Анимировать свойство "Стиль" элемента управления с помощью ObjectAnimationUsingKeyFrames в WPF

Я пытаюсь анимировать свойство "Стиль" с помощью ObjectAnimationUsingKeyFrames. Когда я запускаю образец ниже, я просто вижу пустое окно, и никаких исключений нет.

Почти такой же образец работает в Silverlight. В WPF это также работает, если я назначаю свойство Style элементу управления напрямую. Кто-нибудь знает, возможно ли анимировать свойство 'Style' в WPF?

Большое спасибо.

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:this="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525"
    >
<Window.Resources>
    <ResourceDictionary>

        <Style x:Key="TestStyle" TargetType="Control">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Canvas x:Name="Rectangle">
                            <Rectangle Width="200" Height="150" Fill="Red"/>
                        </Canvas>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
</Window.Resources>
<Canvas>
    <Canvas.Triggers>
        <EventTrigger RoutedEvent="Canvas.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Target" Storyboard.TargetProperty="Style" >
                        <DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="{StaticResource ResourceKey=TestStyle}" />
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Canvas.Triggers>

    <Canvas.Children>
        <ContentControl x:Name="Target"/>
    </Canvas.Children>
</Canvas>

1 ответ

Когда ObjectAnimationUsingKeyFrames пытается оживить до значения, полученного из DependencyObject, он пытается заморозить объект первым. Если объект не может быть заморожен, он генерирует исключение и анимация не запускается.

Если вы анимируете значение пользовательского типа, которое вы написали, похоже, вам нужно либо получить из Freezable или НЕ происходить от DependencyObject,

Для свойств, которые уже существуют, которые происходят от DependencyObject и не FreezableВы не можете оживить их (StyleProperty или же TemplateProperty это примеры). Попробуйте использовать установщик свойств внутри стиля:

<Style.Triggers>
  <Trigger Property="IsEnabled" Value="True">
    <Setter Property="Template" Value="{StaticResource TestTemplate}"/>
  </Trigger>
</Style.Triggers>

Создайте всю логику перехода в стиль вместо переключения между различными стилями. Проблема, с которой вы можете столкнуться, заключается в том, что целевое свойство должно быть свойством зависимости, поэтому вы не можете использовать его. IsLoaded,

Я надеюсь, что вы найдете это полезным.

Одна заключительная мысль: возможно определить пользовательские анимации, хотя я сам этого не делал. Есть шанс, что вы могли бы написать свой собственный "ObjectAnimation", который не был бы ограничен Freezable или неDependencyObject классы.

Другие вопросы по тегам