我一直在尝试使用Windows Phone 8 Silverlight应用程序中的ViewportControl类实现捏合缩放,但没有成功。那里有一些很棒的示例,例如这一示例,但是我无法将我发现的示例映射到我的场景中。
捏和缩放工作正常,操作完成后,我遇到的问题是视口与内容的对齐方式。
我面临的主要问题是,在完成操作后,我无法将缩放后的内容(XAML画布和子树是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的内容和控件本身之间进行转换,然后使用它在控件的空间中获取一个rect作为视口的边界,这种方法不起作用。我的解决方法是将渲染后的内容简单地包装在画布中,然后调整有效(渲染后的)大小。然后,将边界设置为该大小,最后我得到了不错的反弹效果。
我现在面临的问题是,当我调整画布的大小并重置视口的边界时,内容会捕捉到视口的左上角,并且不再以用户提供的收缩区域为中心。
谁能帮助我了解SetViewportOrigin方法如何在ViewportControl上工作?经过捏捏操作后,我看到了一些视口与画布的真正奇怪的数据:
Canvas Size = 1025.69, 1641.11
Bounds = 0,0,1025.69,1641.11
viewport = -56,41.00,480,698
当我什至不调用SetViewportOrigin(Point)时,为什么视口偏移具有非零值(x,y = -56,41)?
这是我在想SetViewportOrigin(Point)方法的工作方式:假设我的Viewport控件本身的大小为400 x 400像素,而我的内容为800 x 800像素。如果将视口的原点设置为100,则将滚动100,将滚动内容,以使前100个垂直像素和100个水平像素被剪切/遮罩/屏外。这不是ViewportControl的工作方式吗?
我想通了,现在是一个快乐的露营者。原来,我使用错误的坐标空间将视口原点设置为一个点。我当时想,如果我想将内容移动到某个位置,则可以在视口的坐标空间中提供该点,然后内容将滚动(设置内容的左上角)。我发现SetViewportOrigin方法获取的Point数据位于内容的坐标空间中。例如:如果您的内容的宽度为500 x 500像素,则视口的宽度为400 x 400像素,并且您希望前100个垂直像素和100个水平像素被视口遮盖(显示该像素的右下角内容),则可以将原点设置为100,100,而不是-100,100。
我在坐标空间之间进行了一堆无用的转换,试图将视口传递到其坐标系中的一个点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句