wpf的像素单位是1/96*系统dpi。当前系统dpi是96,那么wpf的一个单位长就是1px像素。这个系统dpi的意思就是物理单位一英寸里有多少个像素点,比如windows标准的96dpi,意味着一英寸有96个像素。则每个像素大小是1/96(英寸)。计算dpi的方法是(根号下(分辨率横向平方+分辨率纵向平方))/显示屏对角线尺寸(英寸位单位),比如27寸的2k显示器,dpi的计算就等于(根号下(2560*2560)+(1440*1440))/27。这个分辨率就是显示器横向2560个像素,纵向1440个像素。
接下来,我们可以计算一个With=96的按钮在dpi等于96的系统上的按钮的物理英寸大小为96*(1/96*96)/96=1(英寸)。解释一下96*(1/96*96)表示这个按钮的长是多少像素,最后除以96表示除以的是dpi,得到的结果就是1英寸。比如一个dpi为192的系统,一个按钮长为96的按钮的像素值96*(1/96*192)=192px,192(px)/dpi192=1(英寸),虽然dpi增大了,一个长96的按钮的像素值是192px,但是它再除以192dpi,最终得到的结果还是物理尺寸1英寸。
总的来讲,wpf的设备无关性,我的理解就是,无论系统的分辨率是多少,写按钮的Width=96,在这些不同的dpi的显示器上,这个按钮的物理尺寸长度的依然是1英寸。但是如果调整了dpi的倍数,比如120%dpi,那么按钮的物理尺寸就会相应的变长。
在winform中,就会有这样的现象,应用在dpi为96的系统开发,然后放在dpi为85的系统C上,就会发现应用的系统的字体,控件长宽变宽了。这是因为本来a控件写Width=96,但是在C系统上,一英寸只需要85个像素,那么96/85>1英寸了,所以它看起来就变长了。同理,如果是放在dpi为192的系统M上,就会发现控件的长宽字体大小都缩小了一倍,就是因为96/192=0.5(英寸),它只有0.5英寸长了,缩小了一半。
这也是为什么windows会有放大dpi的功能,在120%放大,这个放大不是说dpi*1.2这样放大,而是放大的像素点的大小。那么放大后,相当与表示1英寸所需的像素点将会减少,因为像素点放大了,那么96标准dpi下的软件,在高dpi系统的120%倍放大效果下,它的物理尺寸就会被拉长,因为像素点的边大了,这样字体和控件大小更接近96dpi系统下的大小了。