Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows Phone:Can';无法使ViewportControl对齐_C#_Silverlight_Xaml_Windows Phone 8_Pinchzoom - Fatal编程技术网

C# Windows Phone:Can';无法使ViewportControl对齐

C# Windows Phone:Can';无法使ViewportControl对齐,c#,silverlight,xaml,windows-phone-8,pinchzoom,C#,Silverlight,Xaml,Windows Phone 8,Pinchzoom,我尝试在WindowsPhone8Silverlight应用程序中使用ViewportControl类实现收缩和缩放已经有很长一段时间了,但没有成功。有一些很好的示例,例如,但我无法将我发现的示例映射到我的场景中 收缩和缩放效果很好,我遇到的问题是在操作完成后视口与内容对齐 我面临的主要问题是,操作完成后,我无法将缩放的内容(作为ViewportControl子级的XAML画布和子树)与视口对齐。这会导致视口(可滚动区域)的有效边界与我的内容偏移,导致我的部分内容无法访问/不可滚动 以下是我的操

我尝试在WindowsPhone8Silverlight应用程序中使用ViewportControl类实现收缩和缩放已经有很长一段时间了,但没有成功。有一些很好的示例,例如,但我无法将我发现的示例映射到我的场景中

收缩和缩放效果很好,我遇到的问题是在操作完成后视口与内容对齐

我面临的主要问题是,操作完成后,我无法将缩放的内容(作为ViewportControl子级的XAML画布和子树)与视口对齐。这会导致视口(可滚动区域)的有效边界与我的内容偏移,导致我的部分内容无法访问/不可滚动

以下是我的操作算法:

Canvas Size = 1025.69, 1641.11
Bounds = 0,0,1025.69,1641.11
viewport = -56,41.00,480,698
  • 夹点操作开始
  • 在收缩期间将渲染变换应用于画布的子树
  • 操作完成
  • 将主画布缩放到 渲染变换的子树(如预期那样工作,画布与渲染变换的子树对齐)
  • 获取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)));
    
    这会导致我的内容与视口不对齐

    尝试,尝试,尽管我可能,我还不能找出我在这里做错了什么。。。即使在阅读了说明如何解决此问题的教程之后…:|

    我想现在发生的是,我正在设置边界的rect大小正确,但是它的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
    
    当我甚至不调用SetViewportOrigin(点)时,为什么视口偏移为非零值(x,y=-56,41)


    下面是我对SetViewportOrigin(点)的想法方法有效:假设我的视口控件本身大小为400 x 400像素,我的内容为800 x 800像素。如果我将视口原点设置为100,100,则内容将滚动,以便前100个垂直和100个水平像素将被剪裁/遮罩/屏幕外。ViewportControl不是这样工作的吗?

    I Figure我明白了这一点,现在我是一个快乐的露营者。事实证明,我使用了错误的坐标空间将视口原点设置为一个点。我在想,如果我想将内容移动到某个位置,我会在视口的坐标空间中提供该点,并且内容会滚动(设置内容的左上角点)。我发现SetViewportOrigin方法获取的点数据位于内容的坐标空间中。例如:如果内容的宽度为500 x 500像素,则视口的宽度为400 x 400像素,并且希望视口遮罩前100个垂直像素和100个水平像素(显示内容的右下角),您可以将原点设置为100100,而不是-100100

    我在坐标空间之间做了一些无用的转换,试图在视口的坐标系中传递一个点