Анимировать свойство «Стиль» элемента управления с помощью ObjectAnimationUsingKeyFrames в WPF - PullRequest
6 голосов
/ 03 февраля 2011

Я пытаюсь анимировать свойство 'Style' с помощью 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 Ответ

1 голос
/ 23 марта 2011

Когда 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 классами.

...