当前位置: 首页 > news >正文

笔记:简单介绍WPF中RenderTransform,LayoutTransform, VisualTransform区别

一、目的:简单介绍WPF中RenderTransform,LayoutTransform, VisualTransform区别

        在 WPF 中,RenderTransform、LayoutTransform 和 VisualTransform 是用于对控件进行变换的属性,他们的主要区别是什么,如何选用合适的Transform,本文简要介绍。

它们的主要区别在于应用变换的时机和影响范围。


二、区别

RenderTransform


RenderTransform 是在渲染阶段应用的变换。它不会影响控件的布局,只会影响控件的外观。常用于动画和视觉效果。
•    应用时机:在控件已经完成布局之后。
•    影响范围:仅影响控件的外观,不影响布局。
•    常见用途:旋转、缩放、平移、倾斜等视觉效果。

示例:

<Button Content="RenderTransform Example" Width="200" Height="50"><Button.RenderTransform><RotateTransform Angle="45"/></Button.RenderTransform>
</Button>

LayoutTransform


LayoutTransform 是在布局阶段应用的变换。它会影响控件的布局,并且会触发重新布局。常用于需要影响布局的变换。
•    应用时机:在控件布局之前。
•    影响范围:影响控件的布局和外观。
•    常见用途:旋转、缩放等需要影响布局的变换。
示例:

<Button Content="LayoutTransform Example" Width="200" Height="50"><Button.LayoutTransform><RotateTransform Angle="45"/></Button.LayoutTransform>
</Button>

VisualTransform


VisualTransform 是在视觉层次结构中应用的变换。它是 Visual 类的属性,通常在更底层的视觉对象中使用,而不是直接在控件中使用。
•    应用时机:在视觉层次结构中。
•    影响范围:影响视觉对象的外观。
•    常见用途:更底层的视觉效果变换,通常不直接在控件中使用。
示例:
VisualTransform 通常不直接在 XAML 中使用,而是在更底层的视觉对象中使用。以下是一个使用 VisualTransform 的示例代码:

// 假设你有一个自定义控件 MyVisualControl
public class MyVisualControl : Control
{private VisualCollection _children;private DrawingVisual _drawingVisual;public MyVisualControl(){_children = new VisualCollection(this);_drawingVisual = new DrawingVisual();_children.Add(_drawingVisual);using (DrawingContext dc = _drawingVisual.RenderOpen()){dc.DrawRectangle(Brushes.Blue, null, new Rect(0, 0, 100, 100));}// 应用 VisualTransform_drawingVisual.Transform = new RotateTransform(45);}protected override int VisualChildrenCount => _children.Count;protected override Visual GetVisualChild(int index){return _children[index];}
}

 总结
•    RenderTransform:在渲染阶段应用,不影响布局,常用于动画和视觉效果。
•    LayoutTransform:在布局阶段应用,影响布局和外观,常用于需要影响布局的变换。
•    VisualTransform:在视觉层次结构中应用,影响视觉对象的外观,通常在更底层的视觉对象中使用。

        选择哪种变换属性取决于你需要的效果和变换的时机。如果你只需要改变控件的外观而不影响布局,使用 RenderTransform。如果你需要变换影响布局,使用 LayoutTransform。如果你在更底层的视觉对象中工作,可以使用 VisualTransform。

三、如何选择,性能上有什么区别

RenderTransform


•    性能特点:
•    高效:因为 RenderTransform 仅在渲染阶段应用变换,不会触发重新布局,所以性能较高。
•    适用场景:适用于需要频繁更新的动画和视觉效果,例如旋转、缩放、平移等。
•    性能优势:
•    不会触发布局重算,减少了布局计算的开销。
•    适合需要高频率更新的场景,如动画。

 LayoutTransform


•    性能特点:
•    较低效:因为 LayoutTransform 会影响控件的布局,并且会触发重新布局,所以性能较低。
•    适用场景:适用于需要影响布局的变换,例如旋转、缩放等。
•    性能劣势:
•    会触发布局重算,增加了布局计算的开销。
•    不适合需要高频率更新的场景。

VisualTransform

•    性能特点:
•    高效:VisualTransform 是在视觉层次结构中应用的变换,通常用于更底层的视觉对象,性能较高。
•    适用场景:适用于需要对视觉对象进行变换的场景,通常不直接在控件中使用。
•    性能优势:
•    不会触发布局重算,减少了布局计算的开销。
•    适合需要高频率更新的场景,如动画。

VisualTransform 通常不直接在 XAML 中使用,而是在更底层的视觉对象中使用。以下是一个使用 VisualTransform 的示例代码:

总结
•    RenderTransform:性能较高,因为它仅在渲染阶段应用变换,不会触发重新布局。适用于需要频繁更新的动画和视觉效果。
•    LayoutTransform:性能较低,因为它会影响控件的布局,并且会触发重新布局。适用于需要影响布局的变换,但不适合高频率更新的场景。
•    VisualTransform:性能较高,因为它在视觉层次结构中应用变换,不会触发重新布局。适用于更底层的视觉对象变换,通常不直接在控件中使用。
        选择哪种变换属性取决于你的具体需求和性能考虑。如果你需要高效的变换效果,RenderTransform 和 VisualTransform 是更好的选择。如果你需要变换影响布局,LayoutTransform 是必要的,但要注意其性能开销。

需要了解的知识点

UIElement.RenderTransform 属性 (System.Windows) | Microsoft Learn

FrameworkElement.LayoutTransform Property (System.Windows) | Microsoft Learn

Visual.VisualTransform 属性 (System.Windows.Media) | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 知识改变命运:Java 语言 【可变参数】
  • 【竞品分析】案例分析:直播类竞品分析,理解什么是竞品。
  • 怎样在 SQL 中创建视图(VIEW),以及视图的作用和优势是什么?
  • 【递归 + 记忆化搜索优化】力扣494. 目标和
  • Linux小组件:makefile
  • 基于单片机的智能风扇设计
  • DLMS/COSEM中的信息安全:安全密钥(中)续2
  • Rust:基于cxx的 C++ 混合编程,字符串参数的转换方法
  • 【JS开源库】基于最小二乘法的离散点拟合圆形,计算圆心坐标和半径
  • 关于redisson的序列化配置
  • vs code 插件: Crabviz
  • MAC上设置快捷打开终端以及如何运用剪切快捷键
  • 编程-设计模式 2:抽象工厂模式
  • YOLO好像也没那么难?
  • Windows图形界面(GUI)-MFC-C/C++ - CSliderCtrl
  • ➹使用webpack配置多页面应用(MPA)
  • Angular 响应式表单之下拉框
  • DataBase in Android
  • E-HPC支持多队列管理和自动伸缩
  • JS 面试题总结
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Lsb图片隐写
  • Windows Containers 大冒险: 容器网络
  • 基于游标的分页接口实现
  • 巧用 TypeScript (一)
  • 新书推荐|Windows黑客编程技术详解
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 因为阿里,他们成了“杭漂”
  • 用jQuery怎么做到前后端分离
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 7行Python代码的人脸识别
  • ​Java基础复习笔记 第16章:网络编程
  • "无招胜有招"nbsp;史上最全的互…
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (1)svelte 教程:hello world
  • (1)常见O(n^2)排序算法解析
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (9)目标检测_SSD的原理
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (待修改)PyG安装步骤
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (六)Hibernate的二级缓存
  • (转)ORM
  • (转载)Linux 多线程条件变量同步
  • **CI中自动类加载的用法总结
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .Net Winform开发笔记(一)
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...