ToB企服应用市场:ToB评测及商务社交产业平台

标题: 不可不知的WPF转换(Transform) [打印本页]

作者: 郭卫东    时间: 2024-9-14 22:27
标题: 不可不知的WPF转换(Transform)
在WPF开发中,常常会需要用到UI控件的2D转换(如:旋转,缩放,移动,倾斜等功能),本文以一些简朴的小例子,简述怎样通过Transform类实现FrameworkElement对象的2D转换,仅供学习分享使用,如有不敷之处,还请指正。
 
什么是Transform?

 
转换(Transform)界说怎样将控件从一个坐标空间映射或转换到另一个坐标空间。2D转换可以通过Matrix来实现,Matrix是一个3行3列的double值的集合。不外WPF还提供了多个Transform类,以便在不知道基础矩阵布局配置的情况下转换对象。
 
WPF提供了2D转换(Transform)类,常见的有以下几种:
为了创建更复杂的转换(Transform),WPF还提供了组合转换。如下所示:
 
转换和坐标系

 
转换对象时,同时还会转换对象地点的坐标空间。默认情况下,除TranslateTransform外,转换基于目的对象的坐标系的左上角(0,0)进行转换。如果想要修改转换基点,可以通过CenterX,CenterY属性进行修改。
以左上角(0,0)进行旋转,如下所示:

以矩形中央进行旋转,如下所示:

 
转换元素

 
如果想要将转换应用到控件元素(FrameworkElement),需要创建Transform并应用到FramworkElement类所提供的两个属性之一。控件所对应的两个转换属性,分别如下所示:
将Transform应用到两个属性,都可以达到想要的效果,至于要使用哪个属性,可以根据不同场景进行区分:
 
旋转RotateTransform

 
默认情况下,RotateTansform围绕点(0,0)选择,如下所示:
  1. <Border Margin="30" HorizontalAlignment="Left" VerticalAlignment="Top" BorderBrush="Black" BorderThickness="1" >
  2.     <StackPanel Orientation="Vertical">
  3.         <Button Content="A Button" Opacity="1" />
  4.         <Button Content="Rotated Button">
  5.             <Button.RenderTransform>
  6. <Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
  7.     <Rectangle.RenderTransform>
  8.         <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
  9.     </Rectangle.RenderTransform>
  10. </Rectangle><RotateTransform Angle="45" />
  11.             </Button.RenderTransform>
  12.         </Button>
  13.         <Button Content="A Button" Opacity="1" />
  14.     </StackPanel>
  15. </Border>
复制代码
旋转效果,如下所示:

通过RenderTransformOrigin属性,可以设置应用旋转变换的坐标。如下所示:
  1. <Border Margin="30" HorizontalAlignment="Left" VerticalAlignment="Top" BorderBrush="Black" BorderThickness="1" >
  2.     <StackPanel Orientation="Vertical">
  3.         <Button Content="A Button" Opacity="1" />
  4.         <Button Content="Rotated Button">
  5.             <Button.RenderTransform>
  6. <Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
  7.     <Rectangle.RenderTransform>
  8.         <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
  9.     </Rectangle.RenderTransform>
  10. </Rectangle><RotateTransform Angle="45" />
  11.             </Button.RenderTransform>
  12.         </Button>
  13.         <Button Content="A Button" Opacity="1" />
  14.     </StackPanel>
  15. </Border>
复制代码
修改应用变换坐标后,如下所示:

上述RenderTransformOrigin是相对坐标,范围从(0,0)到(1,1),同样也可以通过RotateTransform的CenterX,CenterY属性进行实现相同的效果。
如果将Transform应用到LayoutTransform,则将导致影响按钮的布局,从而触发布局系统的整个处理过程。如下所示:
  1. <Border Margin="30" HorizontalAlignment="Left" VerticalAlignment="Top" BorderBrush="Black" BorderThickness="1" >
  2.     <StackPanel Orientation="Vertical">
  3.         <Button Content="A Button" Opacity="1" />
  4.         <Button Content="Rotated Button">
  5.             <Button.RenderTransform>
  6. <Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
  7.     <Rectangle.RenderTransform>
  8.         <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
  9.     </Rectangle.RenderTransform>
  10. </Rectangle><RotateTransform Angle="45" />
  11.             </Button.RenderTransform>
  12.         </Button>
  13.         <Button Content="A Button" Opacity="1" />
  14.     </StackPanel>
  15. </Border>
复制代码
应用到LayoutTransform的选择效果,如下所示:

 
缩放ScaleTransform

 
通过ScaleTransform可以对元素进行缩放,通过使用ScaleX,ScaleY属性进行缩放。这两个属性是相对值,表现缩放的倍数,小于1表现缩小,大于1表现放大,即是1表现原始巨细。使用CenterX,CenterY属性指定缩放操纵的中央点。
缩放示比方下所示:
  1. <Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
  2.     <Rectangle.RenderTransform>
  3.         <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
  4.     </Rectangle.RenderTransform>
  5. </Rectangle>
复制代码
通常,将 CenterX 和 CenterY 设置为缩放对象的中央:(Width/2、Height/2)。
  1. <Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
  2.     <Rectangle.RenderTransform>
  3.         <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
  4.     </Rectangle.RenderTransform>
  5. </Rectangle>
复制代码
下图体现了两个 ScaleTransform 操纵之间的差异。虚线体现的是矩形在缩放之前的巨细和位置。

 
倾斜扭曲SkewTransform

 
 扭曲(也称为修剪)是一种以非匀称方式拉伸坐标空间的转换。 SkewTransform 的一种典范用途是在 2D 对象中模拟 3D 深度。
SkewTransform的主要特点如下所示:
示例:如果 AngleX 为 30,则 y 轴绕原点旋转 30 度,将 x 轴的值从该原点扭曲 30 度。 同样地,如果 AngleY 为 30,则将形状的 y 值从原点扭曲 30 度。 
以下示例向 Rectangle 应用自中央点 (0,0) 的 45 度水平扭曲。
  1. <Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
  2.     <Rectangle.RenderTransform>
  3.         <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
  4.     </Rectangle.RenderTransform>
  5. </Rectangle>
复制代码
以下示例向 Rectangle 应用自中央点 (25,25) 的 45 度水平扭曲。
  1. <Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
  2.     <Rectangle.RenderTransform>
  3.         <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
  4.     </Rectangle.RenderTransform>
  5. </Rectangle>
复制代码
以下示例向 Rectangle 应用自中央点 (25,25) 的 45 度垂直扭曲。
  1. <Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
  2.     <Rectangle.RenderTransform>
  3.         <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
  4.     </Rectangle.RenderTransform>
  5. </Rectangle>
复制代码
上述三个示例的效果图如下所示:

 
移动TranslateTransform

 
TranslateTransform主要用于元素的平移(移动),如将TranslateTransform应用于元素的RenderTransform属性,可以在StackPanel或DockPanel内移动元素。可以使用TranslateTransform的X属性和Y属性指定按哪个轴进行移动(单元是像素)。
以下示例使用 TranslateTransform 将元素向右移动 50 个像素,向下移动 50 个像素。
  1. <Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
  2.     <Rectangle.RenderTransform>
  3.         <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
  4.     </Rectangle.RenderTransform>
  5. </Rectangle>
复制代码
 
组合转换TransformGroup

 
通过TransformGroup可以将多个Transform对象归并成一个复合的Transform,并应用到元素的属性。
下面的示例使用 TransformGroup 将 ScaleTransform 和 RotateTransform 应用到 Button。
  1. <Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
  2.     <Rectangle.RenderTransform>
  3.         <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
  4.     </Rectangle.RenderTransform>
  5. </Rectangle><Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
  6.     <Rectangle.RenderTransform>
  7.         <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
  8.     </Rectangle.RenderTransform>
  9. </Rectangle><Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
  10.     <Rectangle.RenderTransform>
  11.         <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
  12.     </Rectangle.RenderTransform>
  13. </Rectangle>
复制代码
以上就是《不可不知的WPF转换(Transform)》的全部内容,旨在抛砖引玉,一起学习,共同进步。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4