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

【WPF】SnapsToDevicePixels与UseLayoutRounding二者到底有什么区别?供参考

原文: 【WPF】SnapsToDevicePixels与UseLayoutRounding二者到底有什么区别?供参考

MSDN上解释了一大堆,二者对比来看,并不能发现什么明显的区别,微软爸爸也不知道多给写图文实例。经过几个小时的摸索,现得到以下共同点和不同点,仅供参考:

共同点

  1. 默认值都是false,如果设置到root元素上,则child元素也自动使用同样设置。
  2. 都是为了解决wpf元素边缘模糊的问题(如下)。

wpf界面元素呈现时为了看起来更平滑一点,是有抗锯齿效果的,抗锯齿效果就会导致边缘模糊。举个例子来说,边缘是如何模糊的:
这里写图片描述
假如你有条横线,在界面上show的时候应该正好摆放在上下两个像素点的中间地带,如上图所示。wpf在呈现这条线时,会把上下两边的像素点同时着色(同样适用于左右两边)。到底着的是什么颜色,wpf会根据自己的一套算法之类的东西计算出来。这样就会导致整体看起来跟自己想要的相比,会有点透明度,也会看起来模糊了。
为了解决这个问题,就出现了SnapsToDevicePixels 和UseLayoutRounding,不过UseLayoutRounding是.net 4.0之后的产物,微软也建议在程序中优先使用UseLayoutRounding。二者的默认值都是false。在上图的那个问题中,不管是设置UseLayoutRounding=true还是SnapsToDevicePixels =true,都会解决模糊的问题。貌似没什么区别。
详见微软给出的模糊不清的例子:
1.FrameworkElement.UseLayoutRounding 属性
2.Pixel Snapping in WPF Applications
其实可见二者区别不大,给出的例子都只是换了换文字:

这里写图片描述

不同点

  1. 二者最大的不同点,其实MSDN上已经讲了:UseLayoutRounding是在during layout的时候生效的,而SnapsToDevicePixels是在during rendering的时候生效的

当layout已经呈现完毕,用UseLayoutRounding所修饰元素的像素对齐样式都已经固定,不依元素位置的变动而动态调整。而SnapsToDevicePixels因为是在render的时候生效的,所以它所修饰的元素 的位置如果发生改变的话,它的像素对齐样式是会改变的。可见下图:
这里写图片描述

这里是5个close的小图标,width和height设置的都是14,原图是72x72像素的,用放大镜放大到600%。
1号:SnapsToDevicePixels=false
2号:SnapsToDevicePixels=true
3号:UseLayoutRounding=false
4号:UseLayoutRounding=true
5号:UseLayoutRounding=false,SnapsToDevicePixels=false
当你拖动window的边框改变window的大小时,这几个图标是上下移动,你会发现除了4号的样式是固定不变的(注意观察内部的白色叉号),其他几个的样式都在动态变化。
注意观察2号的头部,在某个像素位置与其他的相比是少了一部分的(不是等高的)。这就会产生一种不正常的效果,如果你的icon是一个圆形,当把它的宽高设置的比较小时会变成一个正方形或者长方形。

2.从字面意思看UseLayoutRounding有四舍五入取整的意思,而SnapsToDevicePixels没有
用UseLayoutRounding=true修饰一个Grid元素,设置grid的width为100,将grid等分为3列(设置每一列的width为*)。程序运行后可知这三列的ActualWidth里会有两个33和一个34。而如果设置UseLayoutRounding=false或者SnapsToDevicePixels=true,每一列的宽度都会为33.3333333333333,是均分的。

附有一个demo,有二者详细的比较(使用方法:新建解决方案,然后本项目添加进去,运行之后点击ImageWindow按钮。)。

另外,如果你在编码过程中发现设置UseLayoutRounding不管用,那就再设置下SnapsToDevicePixels吧!


参考:
When should I use SnapsToDevicePixels in WPF 4.0?
FrameworkElement.UseLayoutRounding Property
UIElement.SnapsToDevicePixels Property
Pixel Snapping in WPF Applications

相关文章:

  • 每日一Lua(3)-函数
  • Python 学习日记7
  • js实现深拷贝
  • [转载]我再也不想在任何头文件中看到“using namespace xxx;”了
  • Mybatis架构设计及源码分析-SqlSession
  • C# 禁止windows程序重复运行的两种基本方法
  • 代码动态设置edittext输入类型为密码类型
  • 用ASDF来组织Lisp程序编译和加载
  • TensorFlow与OpenCV,读取图片,进行简单操作并显示
  • 移动终端开发必备知识
  • MAC配置环境变量
  • oracle的nvl和sql server的isnull
  • UTC时间与当地时间的转换关系?
  • oracle分页查询
  • 做项目学习Django2.0开发
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • C# 免费离线人脸识别 2.0 Demo
  • co模块的前端实现
  • Flannel解读
  • Github访问慢解决办法
  • nginx 负载服务器优化
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Python 反序列化安全问题(二)
  • React as a UI Runtime(五、列表)
  • scrapy学习之路4(itemloder的使用)
  • sessionStorage和localStorage
  • Shadow DOM 内部构造及如何构建独立组件
  • vue-router的history模式发布配置
  • 普通函数和构造函数的区别
  • 首页查询功能的一次实现过程
  • 微信小程序实战练习(仿五洲到家微信版)
  • 小程序 setData 学问多
  • 找一份好的前端工作,起点很重要
  • 字符串匹配基础上
  • ​​​​​​​​​​​​​​Γ函数
  • ​flutter 代码混淆
  • ​Java并发新构件之Exchanger
  • # 数论-逆元
  • #define,static,const,三种常量的区别
  • #HarmonyOS:软件安装window和mac预览Hello World
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (C语言)逆序输出字符串
  • (js)循环条件满足时终止循环
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (过滤器)Filter和(监听器)listener
  • (汇总)os模块以及shutil模块对文件的操作
  • (六)激光线扫描-三维重建
  • (七)c52学习之旅-中断
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (数据结构)顺序表的定义
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)Linq学习笔记