Анимировать свойство "Стиль" элемента управления с помощью 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
классы.