【WPF】RenderTransform和LayoutTransform
布局系统
在WPF中,许多绘图任务通过使用变换(transform)可以变得更加简单——变换是通过不加通告地切换形状或元素使用的坐标系统来改变形状或元素绘制方式的对象。在WPF中,变换的一些类大多继承自System.Windows.Media.Trandform。下面是这些类的列表:
- TranslateTransform:将坐标系统移动一定的距离。
- RolateTransform:旋转坐标系统。
- ScaleTransform:放大或最小坐标系统。
- SkewTransform:通过倾斜一定的角度扭曲坐标系统。
- MatrixTransform:使用提供的矩阵的乘积修改坐标系统。
- TransfromGroup:组合多个变换。
变换形状
为了变换形状,将RenderTransform属性指定为希望使用的变换对象,根据使用的变换对象,需要填充不同的属性以配置变换对象,也就是我们上面列举的一些类。 列如:
1 <Button Content="I AM Rotated 35" Width="100"> 2 <Button.RenderTransform> 3 <RotateTransform Angle="35"></RotateTransform> 4 </Button.RenderTransform> 5 </Button>
这里我们将按钮旋转了35度。但是RenderTransform不是在WPF积累中定义的唯一与变换相关的属性。FrameworkElement类还定义了一个LayoutTransform属性。LayoutTransform属性以相同的方式变换元素,但它是在布局之前执行工作,开销比RenderTransform要大,那么我们看一下两者的区别:
1 <Grid> 2 <Grid.RowDefinitions> 3 <RowDefinition/> 4 <RowDefinition/> 5 </Grid.RowDefinitions> 6 <StackPanel> 7 <Button Content="I AM Rotated 35" Width="100"> 8 <Button.RenderTransform> 9 <RotateTransform Angle="35"></RotateTransform> 10 </Button.RenderTransform> 11 </Button> 12 <Button>I am not</Button> 13 </StackPanel> 14 15 <StackPanel Grid.Row="1"> 16 <Button Content="I AM Rotated 35" Width="100"> 17 <Button.LayoutTransform> 18 <RotateTransform Angle="35"></RotateTransform> 19 </Button.LayoutTransform> 20 </Button> 21 <Button>I am not</Button> 22 </StackPanel> 23 </Grid>
该窗口包含两个StackPanel,分别都有两个按钮,一个使用了RenderTransform属性,另一个使用LayoutTransform,第一个StackPanel对两个按钮进行布局时,第一个按钮正常定位,并且在即将呈现之前旋转改按钮。因此旋转过的按钮被重叠在下面。而第二个StackPanel容器中,第一个按钮在呈现之后才进行旋转,也就是LayoutTransform在布局之前执行其工作。看一下效果:
可以看出WPF在对图形渲染方面的支持。