2012-01-24 144 views
0

我在这里潜入WPF,我无法用多点触摸来理解一些东西。
我有两个关于SurfaceScrollViewer的问题。操纵SurfaceScrollViewer内容

首先比较容易:我用SurfaceScrollViewer显示了一张很大的照片,所以我可以平移,但我无法弄清楚如何让内容以屏幕为中心开始。我在SScrollViewer中找不到任何本地对齐属性。如果我提供内容利润率,它就会收获。同样如果我做RenderTransform。如果我做了一个LayoutTransform,它似乎没有改变。有任何想法吗?

我还想在SurfaceScrollViewer内部提供此内容缩放功能。真的,我试图放大和平衡SSV的弹性效果。我应该手动编写操作还是可以将功能修补到SSV中以便缩放? SSV似乎吸收了第二次触及其平移功能。我必须编写一个操作处理程序来发送多点触摸内容,对吧?

我的代码看起来像现在这样的权利:

<Grid x:Name="LayoutGrid" Width="1950" Height="1118" HorizontalAlignment="Center" > 
     <s:SurfaceScrollViewer x:Name="scrollViewer" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" > 

      <local:FloorView x:Name="floorViewer" Width="4209" Height="1442" > 
      <local:FloorView.LayoutTransform> 
       <TranslateTransform X="1000" /> 
      </local:FloorView.LayoutTransform> 
     </local:FloorView> 
     </s:SurfaceScrollViewer> 
</Grid> 

任何帮助深表感谢。谢谢!

回答

0

想通了第一部分:

scrollViewer.ScrollToHorizontalOffset(x); 
scrollViewer.ScrollToVerticalOffset(y); 

看起来像我将不得不控制在SSV操纵事件增加变焦。

0

想通了第二部分内部的ScrollViewer放大的ScrollViewer中

  • 手柄着陆事件
  • 发送一个触及到surfacescrollviewer和
  • 发送两个触摸到内容
  • 启用内容操作
  • 将scrollviewer作为容器进行手柄操作
  • 然后我们E中的增量操作的ScaleTransform添加到内容
  • 不要忘记办理触事件

    private void floorViewer_TouchDown(object sender, TouchEventArgs e) //catch touch events on floorviewer 
    { 
    
        Touch1ID = e.TouchDevice.Id - 16777216; ; 
    
        if (Touch1ID == 0) //if one touch present, TouchDevice.Id is 2^24, two then 2^24+1 (this might just be my machine) 
        { 
         floorViewer.IsManipulationEnabled = false; 
         floorViewer.ReleaseTouchCapture(e.TouchDevice); 
         scrollViewer.CaptureTouch(e.TouchDevice); 
        } 
        else { 
         floorViewer.IsManipulationEnabled = true; 
         foreach(TouchDevice device in scrollViewer.TouchesOver){ 
         scrollViewer.ReleaseTouchCapture(device); 
         floorViewer.CaptureTouch(device); 
         } 
        } 
        StartTimeout(); 
        e.Handled = true; 
    } 
    
    void scrollViewer_TouchUp(object sender,TouchEventArgs e) 
    { 
        clearID(); 
        e.Handled = true; 
    } 
    
    private void clearID() 
    { 
        Touch1ID = 0; 
    } 
    
    private void floorview_TouchUp(object sender, TouchEventArgs e) 
    { 
        clearID(); 
        e.Handled = true; 
    } 
    
    //manipulators on floorviewer when it gets touches passed to it 
    private void scrollViewer_ManipulationStarting(object sender, ManipulationStartingEventArgs e) 
    { 
        e.ManipulationContainer = scrollViewer; 
        e.Handled = true; 
    } 
    
    private void scrollViewer_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) 
    { 
        double oldScale = flrScale; 
        flrScale *= e.DeltaManipulation.Scale.X; 
        if (flrScale < .95 | flrScale > 2) flrScale = oldScale; 
        floorViewer.RenderTransform = new ScaleTransform(flrScale, flrScale, e.ManipulationOrigin.X + flrInitX, e.ManipulationOrigin.Y + flrInitY); 
    
    
        e.Handled = true; 
    } 
    

    热潮!

+0

显然应该是LayoutTransform而不是RenderTransform!避免种植 – aleatoric