WPF窗口位置属性Left,Top,Height和Width实际上是否翻了三倍?

时间:2011-02-08 18:47:03

标签: .net wpf windows

WPF窗口的排名属性LeftTopHeightWidth是双打。但是,当interacting with windows messagesWM_MOVINGWM_MOVE相同时,必须将双重投放到integral type

这对我来说似乎没问题,因为所有的Windows通知似乎都在所有的位置参数中使用了整数类型,我想这些消息与WPF位置属性密切相关。

所以问题是,我在这个假设中是否正确,或者Windows通知实际上是否会加倍,最终会对此产生一些奇怪的副作用?

2 个答案:

答案 0 :(得分:3)

在WPF窗口中,这些属性实际上映射到Window的位置,正如您所指出的那样(在Windows中)最终会映射到整数值。

然而,它们被定义为双精度,这很好,因为它们干净地映射到(并继承)其他FrameworkElement属性,即:FrameworkElement.Width。窗口中的元素确实利用了双精度,因为它们被设计为独立于分辨率,并允许通过变换等任意缩放。

要生成这些整数,框架必须使Window不是FrameworkElement,或者为这些定义单独的属性,忽略FrameworkElement的属性。任何一种选择都会引起混淆,并且比留下这些双重值更糟糕。此外,意识到未来的实现可能会使用子像素定位 - 虽然Windows API现在不支持这一点,但理论上它可能(不太可能)将来可能。

答案 1 :(得分:2)

当涉及到Windows消息和窗口位置时,数字必须转换为整数,毫无疑问。

但是在实际输出之前,项目坐标可以移动一些少量(例如,小于0.5像素),或者包含项目可以被一些非整数系数拉伸。浮点坐标的另一个应用是将一些空间划分为大小相等的列:不能将浮点数除以100个像素(好吧,浮点数仍有一些错误,但它可以被忽视了。)

因此,它们上面的所有内部坐标和操作都是以双精度计算的,只有在实际屏幕上才会转换为int。