Windows phone 7 初始比例小于1的画布收缩和缩放

Windows phone 7 初始比例小于1的画布收缩和缩放,windows-phone-7,Windows Phone 7,我有一个外部画布,里面我正在加载另一个画布(大尺寸)。我已经设置了剪辑几何体,所以屏幕上只能看到内部(大)画布的一部分 由于内部画布的大小很大,所以我将内部画布的初始比例保持为0.4,即我在内部画布上应用了复合变换,并将scaleX和scaleY设置为0.4 现在我已经在PinchStart和PinchDelta上实现了手势侦听器方法。在OnPinchDelta中,我正在缩放画布 问题是,由于初始比例为0.4,所以直到比例达到(或比例超过1),画布没有从中心缩放意味着其位置发生变化。但是,一旦比

我有一个外部画布,里面我正在加载另一个画布(大尺寸)。我已经设置了剪辑几何体,所以屏幕上只能看到内部(大)画布的一部分

由于内部画布的大小很大,所以我将内部画布的初始比例保持为0.4,即我在内部画布上应用了复合变换,并将scaleX和scaleY设置为0.4

现在我已经在PinchStart和PinchDelta上实现了手势侦听器方法。在OnPinchDelta中,我正在缩放画布

问题是,由于初始比例为0.4,所以直到比例达到(或比例超过1),画布没有从中心缩放意味着其位置发生变化。但是,一旦比例因子达到(或穿过)1,画布的缩放就会正确开始

简而言之,当比例因子小于1时,缩放不会从中心或其他方向进行,画布位置不会保持正确

我尝试过许多不同的方法,但比例因子小于1对我来说并不合适。任何帮助

var factor = // calculate this based on amount of data and the speed
var width = // element rendered width
var height = // element rendered height
var changeInWidth = (1-factor) * width; // can be 0, neg or pos
var changeInHeight = (1-factor) * height;
var changeInX = changeInWidth / 2;
var changeInY = changeInHeight / 2;

Canvas.SetLeft(element, Canvas.GetLeft(element) + changeInX);
Canvas.SetTop(element, Canvas.GetTop(element) + changeInY);
只需确保元素被画布包裹,否则左侧和顶部将被忽略

为了计算系数,您可以使用e.距离比;
它本身可以用作因子,但如果要增加(例如1.2)或减少(0.8),可以将其乘以常数缩放的速度。

为什么不将Canvas.Left和Canvas.Top与PinchDelta中的水平变化相乘?你的意思是Canvas.SetLeft和Canvas.SetTop方法?我将在下面的回答中包括更详细的解释。谢谢,你能告诉我如何计算因子(在pinch delta事件中)以及你的意思是什么吗“只需确保您的元素由画布包装即可“,我有一个内部画布,放在一个外部画布上。关于画布,你的结构还可以。我添加了更多关于factor的评论。此外,此链接也很有用:在将比例应用于内部画布之前,我必须先设置这些设置,或者在这之后,对于任何比例因子,也必须设置小于1的比例。您需要在应用比例之前设置这些设置,因为您要测量更改。我应用了这些设置,结果是在特定比例之后,内部画布完全消失。