2012-01-24 4 views
0

私はここでWPFに潜入しています。私はマルチタッチでいくつかのことを理解することはできません。
SurfaceScrollViewerについて2つの質問があります。SurfaceScrollViewerのコンテンツを操作する

簡単に最初に:私は、私は周囲にパンすることができますので、私はSurfaceScrollViewerで表示されている大きな写真を持っているが、私はどのように画面の中央に開始するコンテンツを取得することができません。 SScrollViewerでネイティブの配置プロパティを見つけることができません。コンテンツマージンを与えると、それが作物になります。 RenderTransformを実行する場合も同じです。 LayoutTransformを行うと、それは変更を行うようには見えません。何か案は?

また、このコンテンツズーム機能をSurfaceScrollViewerの内側に配置したいと考えています。本当に私はSSVの弾力的な効果をズームしてパンしようとしています。私は手で操作を書き出すべきか、またはSSVの機能を拡大してパッチできるか? SSVが2番目のタッチをパンニング機能に吸収するようです。私はコンテンツにマルチタッチを送信するための操作ハンドラを書かなければならないだろうか?

私のコードは今、この権利のようになります。

<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

は、最初の部分を考え出した:私はズームを追加するSSVの操作イベントを制御する必要がありますよう

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

が見えます。

0

は、コンテンツに操作を可能にする1つのsurfacescrollviewerと

  • コンテンツ
  • への2つのタッチを送信するためにタッチScrollViewerの
  • 送信に

      ScrollViewerの内部
    • ハンドルタッチダウンイベントを拡大するために、第2の部分を考え出し
    • スクロールビューアをコンテナとするハンドル操作
    • then us電子コンテンツ
    • に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

    明らかに、RenderTransformではなくLayoutTransformである必要があります。切り抜かないようにする – aleatoric

    関連する問題