关闭

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

标签: wpfSnapsT
508人阅读 评论(0) 收藏 举报
分类:

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

0
0
查看评论

WPF SnapsToDevicePixels用途

SnapsToDevicePixels 获取或设置在呈现过程,该值来确定呈现此元素是否应使用特定于设备的像素设置。 这是一个依赖项属性。 属性值 类型:System.Boolean true ,如果元素应以符合呈现到设备像素;否则, false。&#...
  • wudidagou
  • wudidagou
  • 2013-09-25 10:12
  • 3691

再论WPF中的UseLayoutRounding和SnapsToDevicePixels

最近在调试项目中的UI时发现几个诡异问题: 1.Grid容器里的GridSplitter设置粗细一样, 但截屏放大后发现线条不一样粗并且明暗不一致,导致打印出来有问题。 2.自定义控件的边缘在某些窗体中显示模糊。 导致以上问题的原因是:1)UserLayoutRounding为False,导致控...
  • muzizongheng
  • muzizongheng
  • 2013-11-05 11:16
  • 5395

UseLayoutRounding vs. SnapsToDevicePixels

前几天无意中在网上发现一个博客系列《关于WPF你应该知道的2000件事》,是以为叫Sean Sexton的牛人写的。个人觉得很有意思,因此决定找些自己感兴趣的翻译出来。就从曾经困扰我很久的一个SnapsToDevicePixels开始吧。译文如下: #454 – UseLayoutRoundin...
  • Libby1984
  • Libby1984
  • 2016-06-01 17:48
  • 769

WPF-MVVM模式学习笔记5——NotificationObject学习

上一章,我学习了lambda表达式和lambda表达式树。这一次再反过头来看NotificationObject,就能看懂意思了,虽然其中还有一点没有看明白,但是那是细节,先从宏观上分析一下这个类。 public abstract class NotificationObject : IN...
  • mybelief321
  • mybelief321
  • 2015-03-20 17:19
  • 1879

【WPF】右下角弹出自定义通知样式(Notification)——简单教程

1.先看效果2.实现1.主界面是MainWindow上面就只摆放一个Button即可。在Button的点击事件中需要new一个弹出的NotificationWindow。代码如下: public static List<NotificationWindow> _dialogs = new...
  • catshitone
  • catshitone
  • 2017-07-13 18:11
  • 2092

WPF实现窗口从右下角垂直向上和水平向左淡出

受到腾讯弹出新闻什么的启发,才想着去实现了一下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Sys...
  • u010771437
  • u010771437
  • 2015-08-15 15:18
  • 1936

WPF SnapsToDevicePixels作用

可以在您的根元素上将此属性设为 true,以在整个 UI 上启用像素对齐呈现。 对于运行在大于 96 dots per inch (dpi) 的设备,像素对齐呈现可以最小化在单一实线附近出现的抗锯齿视觉瑕疵。 当由 FrameworkElement 或任何可...
  • lianchangshuai
  • lianchangshuai
  • 2012-06-15 10:08
  • 10042

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

MSDN上解释了一大堆,二者对比来看,并不能发现什么明显的区别,微软爸爸也不知道多给写图文实例。经过几个小时的摸索,现得到以下共同点和不同点,仅供参考:共同点 默认值都是false,如果设置到root元素上,则child元素也自动使用同样设置。 都是为了解决wpf元素边缘模糊的问题(如下)。 wpf...
  • catshitone
  • catshitone
  • 2017-08-21 19:05
  • 508

【.Net码农】分享一款Metro风格的WPFUI

http://blog.csdn.net/ljf5566/article/details/41598269 实现思路         用到的开源项目MahApps.Metro。具体使用请看官网文档。 主要代码 换肤弹窗 ...
  • CrackLibby
  • CrackLibby
  • 2015-03-31 22:47
  • 1342

HTML与XHTML —— 二者有什么区别

1、DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动。 document.documentElement 返回文档的根节点 document.body document.activeElement 返回当前文档中被击活的标签节点(ie) event.fro...
  • Wsrichyong
  • Wsrichyong
  • 2016-11-14 11:57
  • 4035
    个人资料
    • 访问:206182次
    • 积分:2788
    • 等级:
    • 排名:第14688名
    • 原创:90篇
    • 转载:18篇
    • 译文:1篇
    • 评论:36条
    文章分类
    最新评论