我一直试图在Windows Phone 8 Silverlight应用程序中使用ViewportControl类来实现捏和缩放相当长一段时间没有任何成功。有一些很好的示例,例如this one,但我无法将我发现的示例映射到我的场景。Windows Phone:无法让ViewportControl对齐
捏和缩放工作正常,我遇到的问题是在操作完成后视口与内容对齐。
我现在面临的主要问题是,我的操作完成后,我一直无法对齐的缩放内容(一个XAML画布和子树,是ViewportControl的子级)对视。这会导致视口(可滚动区域)的有效范围与我的内容偏移,导致部分内容无法访问/无法解析。
这里是我的操纵算法:
- 捏操作开始。
- 在夹点时应用渲染变换到画布的子树。
- 操作完成。
- 将主要画布缩放为 渲染转换子树的效果大小(此工作正常,画布与渲染转换的子树对齐)。
- 获取ViewportControl中的画布和视口控件本身之间的转换。
- 使用变换获得一个边界矩形(我期望)应该代表一个矩形,该矩形覆盖了我想要在ViewportControl, 内但在托管ViewportControl的坐标空间内滚动的内容。
- 将此矩形应用于ViewportControl的视口边界。
- 将视区的原点到画布
这里的翻译左上角坐标是我计算和应用新的边界,操作完成后:
// Obtain transform between canvas and ViewportControl
GeneralTransform gt = m_MainCanvas.TransformToVisual(m_ViewportControl);
Rect newBounds = gt.TransformBounds(new Rect(0, 0, m_MainCanvas.Width, m_MainCanvas.Height));
m_ViewportControl.Bounds = newBounds;
// set the origin of the viewport again
m_ViewportControl.SetViewportOrigin(gt.Transform(new Point(0, 0)));
这导致我的内容与视口不一致。
尝试,尽我所能,我一直无法弄清楚我在这里做错了什么...即使在看了教程,显示如何解决这个问题...:|
我认为正在发生的事情是,我正在设置边界的大小正确,但它的X和Y坐标已关闭。我希望这可以通过使用画布和ViewportControl本身之间的转换来解决,但显然不是。
问题:我如何正确设置ViewportControl的原点(我如何计算传递给SetViewportOrigin方法的点?是否有人可以解释人们在缩放内容和视口之间使用的比例我在如何破解这个其他例子看?
2014年7月8日更新
我在这里取得了一些进展。我在ViewportControl中的内容和控件本身之间获得转换的方法,然后使用它在控件空间中获取用作视口边界的矩形不起作用。我的解决方法是简单地将渲染转换后的内容封装在调整有效(渲染变换)大小的画布中。然后我将界限设置为这个尺寸,并且我终于有了很好的反弹效果。
我现在面临的问题是,当我调整画布大小并重置视口的边界时,内容会捕捉到视口的左上角,并且不再以夹点区域为中心用户提供。
任何人都可以帮助我了解SetViewportOrigin方法如何在ViewportControl上工作?我看到的视口与画布一些非常奇怪的数据的捏操作之后:
Canvas Size = 1025.69, 1641.11
Bounds = 0,0,1025.69,1641.11
viewport = -56,41.00,480,698
为什么视非零值偏移(X,Y = -56,41)时,我不甚至不会调用SetViewportOrigin(Point)?
下面是我在考虑SetViewportOrigin(Point)方法的工作原理:假设我的Viewport控件本身大小为400 x 400像素,我的内容为800 x 800像素。如果我将视口的原点设置为100,100,则内容将滚动,这样前100个垂直像素和100个水平像素将被剪裁/屏蔽/离屏。这不是ViewportControl的工作原理吗?