动态变换提供了自定义元素的最强大方式之一。每个元素都能以两种不同的方式使用变换,RenderTransform属性和LayoutTransform属性。RenderTransform属性效率更高。因为是在布局之后应用变换,并且用于变换最终的渲染输出。 LayoutTransform在布局前应用,从而其他控件需要重新排列以适应变换。
下面我就举一个例子来说一下:
<!--窗口资源-->
<Window.Resources>
<!--按钮样式-->
<Style TargetType="{x:Type Button}">
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="60"/>
<Setter Property="Margin" Value="10"/>
<Setter Property="FontSize" Value="20"/>
<!--Render :渲染;Transform:动画;Origin:起点,
RenderTransformOrigin:渲染动画的起点(控制动画起点)
取值为一个坐标的形式 取值范围: 0,0 到 1,1
0,0:表示左上角,如此设置后动画会以左上角为基准点开始;
0.5,0.5:表示中心;
1,1:表示右下角;-->
<Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
<Setter Property="RenderTransform">
<Setter.Value>
<!--使用RotateTransform时,一定要使用TransformGroup,
否则不能进行动画哦-->
<TransformGroup>
<!--RotateTransform:能够让某对象产生旋转变化,根
据中心点进行顺时针旋转或逆时针旋转。-->
<RotateTransform/>
</TransformGroup>
</Setter.Value>
</Setter>
<!--样式关联触发器-->
<Style.Triggers>
<!--MouseLeave鼠标进入事件-->
<EventTrigger RoutedEvent="Button.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever"
Storyboard.TargetProperty="RenderTransform.Children[0].Angle">
<DoubleAnimation From="0" To="360" Duration="0:0:2"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<!--MouseLeave鼠标离开事件-->
<EventTrigger RoutedEvent="Button.MouseLeave">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard Storyboard.TargetProperty="RenderTransform.Children[0].Angle">
<DoubleAnimation To="0" Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<!--页面布局:栈式面板-->
<StackPanel>
<Button Content="Test1"/>
<Button Content="Tes2"/>
<Button Content="Test3"/>
<Button Content="Test4"/>
</StackPanel>
下面是例子的效果图: