Rom*_*man 6 wpf controls styles animated
我正在尝试使用ObjectAnimationUsingKeyFrames为'Style'属性设置动画.当我运行下面的示例时,我只看到空窗口,没有任何异常.
几乎相同的示例在Silverlight中工作.在WPF中,如果我直接指定控件的"Style"属性,它也可以工作.有谁知道是否有可能在WPF中设置'Style'属性的动画?
非常感谢.
<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>
Run Code Online (Sandbox Code Playgroud)
当ObjectAnimationUsingKeyFrames
尝试将动画设置为派生自 的值时DependencyObject
,它会首先尝试冻结对象。如果无法冻结对象,则会引发异常并且动画不会运行。
如果您要对您编写的自定义类型的值进行动画处理,那么您似乎需要从 派生Freezable
或不从 派生DependencyObject
。
对于派生自DependencyObject
和 not的已存在的属性Freezable
,您无法对它们进行动画处理(StyleProperty
或者TemplateProperty
是恰当的例子)。尝试在样式内使用属性设置器:
<Style.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter Property="Template" Value="{StaticResource TestTemplate}"/>
</Trigger>
</Style.Triggers>
Run Code Online (Sandbox Code Playgroud)
将所有转换逻辑构建到样式中,而不是在不同样式之间切换。您可能遇到的一个挑战是目标属性必须是依赖属性,因此您不能使用IsLoaded
.
希望这个对你有帮助。
最后一个想法:可以定义自定义动画,尽管我自己没有这样做过。您有可能编写自己的自定义“ObjectAnimation”,该动画不受类Freezable
或非类的限制DependencyObject
。