首页 > 其他分享 >不可不知的WPF转换(Transform)

不可不知的WPF转换(Transform)

时间:2024-09-14 22:24:46浏览次数:1  
标签:转换 缩放 元素 Transform 所示 WPF 属性

在WPF开发中,经常会需要用到UI控件的2D转换(如:旋转,缩放,移动,倾斜等功能),本文以一些简单的小例子,简述如何通过Transform类实现FrameworkElement对象的2D转换,仅供学习分享使用,如有不足之处,还请指正。

 

什么是Transform?

 

转换(Transform)定义如何将控件从一个坐标空间映射或转换到另一个坐标空间。2D转换可以通过Matrix来实现,Matrix是一个3行3列的double值的集合。不过WPF还提供了多个Transform类,以便在不知道基础矩阵结构配置的情况下转换对象。

 

WPF提供了2D转换(Transform)类,常见的有以下几种:

  • RotateTransform,按指定的角度(Angle)旋转元素。
  • ScaleTansform,按指定的坐标方向(ScaleX和ScaleY)缩放元素。
  • SkewTransform,按指定的角度(AngleX和AngleY)倾斜元素。
  • TranslateTransform,按指定的X轴和Y轴移动元素,不过这种移动并非是真实的移动,只是呈现上的移动。

为了创建更复杂的转换(Transform),WPF还提供了组合转换。如下所示:

  • TransformGroup,将多个TransformGroup对象组成单个Transform,然后就可以应该到一个UI元素的Transform属性上。
  • MatrixTransform,创建自定义的转换,使用MatrixTransform时,可以直接操作矩阵。

 

转换和坐标系

 

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

以左上角(0,0)进行旋转,如下所示:

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

 

转换元素

 

如果想要将转换应用到控件元素(FrameworkElement),需要创建Transform并应用到FramworkElement类所提供的两个属性之一。控件所对应的两个转换属性,分别如下所示:

  • LayoutTransform,在布局之前应用转换,布局系统处理转换之后的大小和定位。
  • RenderTransform,修改元素外观的转换,在布局完成后应用。

将Transform应用到两个属性,都可以达到想要的效果,至于要使用哪个属性,可以根据不同场景进行区分:

  • 在对元素进行缩放,选择,或倾斜,并且需要父级元素来对元素转换后的大小进行调整是,可以使用LayoutTransform属性。
  • 如果使用动画处理后的Transform对象时,可以使用RenderTransform。并且由于RenderTransform属性提供性能优势,所以应尽可能的使用此属性。

 

旋转RotateTransform

 

默认情况下,RotateTansform围绕点(0,0)选择,如下所示:

<Border Margin="30" HorizontalAlignment="Left" VerticalAlignment="Top" BorderBrush="Black" BorderThickness="1" >
    <StackPanel Orientation="Vertical">
        <Button Content="A Button" Opacity="1" />
        <Button Content="Rotated Button">
            <Button.RenderTransform>
                <RotateTransform Angle="45" />
            </Button.RenderTransform>
        </Button>
        <Button Content="A Button" Opacity="1" />
    </StackPanel>
</Border>

旋转效果,如下所示:

通过RenderTransformOrigin属性,可以设置应用旋转变换的坐标。如下所示:

<Border Margin="30" HorizontalAlignment="Left" VerticalAlignment="Top" BorderBrush="Black" BorderThickness="1" >
    <StackPanel Orientation="Vertical">
        <Button Content="A Button" Opacity="1" />
        <Button Content="Rotated Button" RenderTransformOrigin="0.5,0.5">
            <Button.RenderTransform>
                <RotateTransform Angle="45" />
            </Button.RenderTransform>
        </Button>
        <Button Content="A Button" Opacity="1" />
    </StackPanel>
</Border>

修改应用变换坐标后,如下所示:

上述RenderTransformOrigin是相对坐标,范围从(0,0)到(1,1),同样也可以通过RotateTransform的CenterX,CenterY属性进行实现相同的效果。

如果将Transform应用到LayoutTransform,则将导致影响按钮的布局,从而触发布局系统的整个处理过程。如下所示:

<Border Margin="30" HorizontalAlignment="Left" VerticalAlignment="Top" BorderBrush="Black" BorderThickness="1">
    <StackPanel Orientation="Vertical">
        <Button Content="A Button" Opacity="1" />
        <Button Content="Rotated Button">
            <Button.LayoutTransform>
                <RotateTransform Angle="45"  />
            </Button.LayoutTransform>
        </Button>
        <Button Content="A Button" Opacity="1" />
    </StackPanel>
</Border>

应用到LayoutTransform的选择效果,如下所示:

 

缩放ScaleTransform

 

通过ScaleTransform可以对元素进行缩放,通过使用ScaleX,ScaleY属性进行缩放。这两个属性是相对值,表示缩放的倍数,小于1表示缩小,大于1表示放大,等于1表示原始大小。使用CenterX,CenterY属性指定缩放操作的中心点。

缩放示例如下所示:

<Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
    <Rectangle.RenderTransform>
        <ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
    </Rectangle.RenderTransform>
</Rectangle>

通常,将 CenterX 和 CenterY 设置为缩放对象的中心:(Width/2、Height/2)。

<Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Canvas.Left="100" Canvas.Top="100" Stroke="Blue" StrokeThickness="2">
    <Rectangle.RenderTransform>
        <ScaleTransform CenterX="25" CenterY="25" ScaleX="2" ScaleY="2" />
    </Rectangle.RenderTransform>
</Rectangle>

下图显示了两个 ScaleTransform 操作之间的差异。虚线显示的是矩形在缩放之前的大小和位置。

 

倾斜扭曲SkewTransform

 

 扭曲(也称为修剪)是一种以非均匀方式拉伸坐标空间的转换。 SkewTransform 的一种典型用途是在 2D 对象中模拟 3D 深度。

SkewTransform的主要特点如下所示:

  • 使用 CenterX 和 CenterY 属性指定 SkewTransform 的中心点。
  • 使用 AngleX 和 AngleY 属性指定 x 轴和 y 轴的扭曲角度,并沿这些轴扭曲当前坐标系统。

示例:如果 AngleX 为 30,则 y 轴绕原点旋转 30 度,将 x 轴的值从该原点扭曲 30 度。 同样地,如果 AngleY 为 30,则将形状的 y 值从原点扭曲 30 度。 

以下示例向 Rectangle 应用自中心点 (0,0) 的 45 度水平扭曲。

<Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
    <Rectangle.RenderTransform>
        <SkewTransform CenterX="0" CenterY="0" AngleX="45" AngleY="0" />
    </Rectangle.RenderTransform>
</Rectangle>

以下示例向 Rectangle 应用自中心点 (25,25) 的 45 度水平扭曲。

<Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Canvas.Left="100" Canvas.Top="100" Stroke="Blue" StrokeThickness="2">
    <Rectangle.RenderTransform>
        <SkewTransform CenterX="25" CenterY="25" AngleX="45" AngleY="0" />
    </Rectangle.RenderTransform>
</Rectangle>

以下示例向 Rectangle 应用自中心点 (25,25) 的 45 度垂直扭曲。

<Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
    <Rectangle.RenderTransform>
        <SkewTransform CenterX="25" CenterY="25" AngleX="0" AngleY="45" />
    </Rectangle.RenderTransform>
</Rectangle>

上述三个示例的效果图如下所示:

 

移动TranslateTransform

 

TranslateTransform主要用于元素的平移(移动),如将TranslateTransform应用于元素的RenderTransform属性,可以在StackPanel或DockPanel内移动元素。可以使用TranslateTransform的X属性和Y属性指定按哪个轴进行移动(单位是像素)。

以下示例使用 TranslateTransform 将元素向右移动 50 个像素,向下移动 50 个像素。

<Rectangle Height="50" Width="50" Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2" Canvas.Left="100" Canvas.Top="100">
    <Rectangle.RenderTransform>
        <TranslateTransform X="50" Y="50" />
    </Rectangle.RenderTransform>
</Rectangle>

 

组合转换TransformGroup

 

通过TransformGroup可以将多个Transform对象合并成一个复合的Transform,并应用到元素的属性。

下面的示例使用 TransformGroup 将 ScaleTransform 和 RotateTransform 应用到 Button。

<Button RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Center" Content="Click">
    <Button.RenderTransform>
        <TransformGroup>
            <ScaleTransform ScaleY="3" />
            <RotateTransform Angle="45" />
        </TransformGroup>
    </Button.RenderTransform>
</Button>

以上就是《不可不知的WPF转换(Transform)》的全部内容,旨在抛砖引玉,一起学习,共同进步。

标签:转换,缩放,元素,Transform,所示,WPF,属性
From: https://www.cnblogs.com/hsiang/p/18408953

相关文章

  • transformer(李宏毅笔记)
    transformerEncoder之前的Self-attention其实已经提到过transformer,而且transformer和后面的bert也有很大关系,transformer就是一个sequencetosequence的model这些都是输出不定长的例子,语音识别+机器翻译=语音翻译吗,有些语言可能没有文字,或者说某些方言训练这样的模型,你就......
  • 顶刊算法 | 鹈鹕算法POA-Transformer-LSTM多变量回归预测
    顶刊算法|鹈鹕算法POA-Transformer-LSTM多变量回归预测目录顶刊算法|鹈鹕算法POA-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料效果一览基本介绍1.Matlab实现顶刊算法|鹈鹕算法POA-Transformer-LSTM多变量回归预测(程序可以作为JCR一区级论文代码支撑,目......
  • 小众创新组合!LightGBM+BO-Transformer-LSTM多变量回归交通流量预测(Matlab)
    小众创新组合!LightGBM+BO-Transformer-LSTM多变量回归交通流量预测(Matlab)目录小众创新组合!LightGBM+BO-Transformer-LSTM多变量回归交通流量预测(Matlab)效果一览基本介绍程序设计参考资料效果一览基本介绍1.Matlab实现LightGBM+BO-Transformer-LSTM多变量回归预测,LightGBM+BO-......
  • [WPF]XAML中使用IMultiValueConverter实现Command的多参数传参
    对ICommand进行多参数传参问题如何对ICommand传入多个参数?背景最近在做一个WPF的开发,有多个相近的功能写了不同的Command,因为要对应不同的对象。因为是CtrlCV,显得代码有点冗赘不够优雅,但是ICommand又只能接受一个参数。思路使用MultiBinding,对CommandParameter进行绑定,然后......
  • MySQL字符集的转换
    背景介绍在使用MySQL过程中,如果字符集配置不当,可能会出现插入失败、数据乱码、索引失效、数据丢失、查询不到期望结果等一系列使用异常的情况。因此,熟练掌握MySQL字符集和比较规则的配置方法,并在此基础上了解MySQL字符集与比较规则的核心逻辑,才能从源码和实现层面上理解,为......
  • VS+QT--实现二进制和十进制的转换(含分数部分)
    实现效果: 主要文件:BtD_DtB_converter.cpp#include"BtD_DtB_converter.h"#include<qpushbutton.h>#include<qlineedit.h>#include<qstring.h>#pragmaexecution_character_set("utf-8")BtD_DtB_converter::BtD_DtB_converter(Q......
  • 音频转换芯片DP7344兼容CS4344双通道24位DA转换器
    产品简介DP7344是一款完整的2通道输出数模转换芯片,内含插值滤波器、Multi-Bit数模转换器、输出模拟滤波器,并支持大部分的音频数据格式。DP7344基于一个带线性模拟低通滤波器的四阶Multi-BitΔ∑调制器,自动检测信号频率和主时钟频率,在2KHz和200KHz之间自动调节采样率。DP......
  • Pbootcms将日期时间转换成"刚刚、几分钟、几小时前"的形式
    为了实现类似于“刚刚;1小时前;昨天几点几分;前天几点几分;年月日几点几分”的个性化日期效果,你需要按照以下步骤进行操作:找到 ExtLabelController.php 文件。添加新的方法 transtime。在 run 方法中调用 transtime 方法。在模板页面中使用该标签。具体步骤1.找到......
  • WPF datagrid contextmenu menuitem commandparameter CommandParameter="{Binding R
    Install-packagenewtonsoft.json  <DataGrid.ContextMenu><ContextMenu><MenuItemHeader="ExportSelected"Command="{BindingExportSelectedCmd}"CommandParameter="{BindingRelativeSource={Relat......
  • 自定义WPF滑块样式-Slider
    在Windows应用程序开发中,滑块(Slider)是一个非常常见且有用的控件。它可以让用户通过拖动滑块来选择一个范围内的值。然而,WPF或UWP应用程序中的默认滑块样式可能并不总是符合我们的设计需求。因此,我们需要自定义滑块的样式。在本文中,我将向你展示如何使用XAML(ExtensibleApplicat......