2012-01-24 57 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