2016-09-25 4 views
1

C#でキャンバスズーム機能を実装しようとしています。私は1つの特定の点を拡大することができますが、元の縮尺(私は元の縮尺に制限されています)にズームしながら、キャンバスの位置が変更されます(ウィンドウ外)。私は元の位置にズームアウトしたいと思います。誰も助けることができますか?C#Canvas Zoom機能の問題?マトリックス変換を使用してポイントをズームインした後、元の位置にズームアウトできない

見つけてください以下のコード:

<ScrollViewer Name="C1_S" Grid.Row="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" VerticalAlignment="Bottom" Grid.ColumnSpan="2" > 
        <Canvas Name="canvas_core0" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Bottom" Height="600" Width="1000000" MouseWheel="Canvas_MouseWheel" ClipToBounds="True" > 
         <Canvas.Background> 
          <DrawingBrush TileMode="Tile" Viewport="0,20,40,40" ViewportUnits="Absolute"> 
           <DrawingBrush.Drawing> 
            <GeometryDrawing> 
             <GeometryDrawing.Geometry> 
              <RectangleGeometry Rect="0,0,50,50"/> 
             </GeometryDrawing.Geometry> 
             <GeometryDrawing.Pen> 
              <Pen Brush="Gray" Thickness=".1"/> 
             </GeometryDrawing.Pen> 
            </GeometryDrawing> 
           </DrawingBrush.Drawing> 
          </DrawingBrush> 
         </Canvas.Background> 
         <Canvas.RenderTransform> 
          <MatrixTransform/> 
         </Canvas.RenderTransform> 
        </Canvas> 
       </ScrollViewer> 

C#コード: `

 private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     var element = sender as UIElement; 
     var position = e.GetPosition(element); 
     if(e.Delta>0) 
     { 
      previousposition = position; 
     } 
     var transform = element.RenderTransform as MatrixTransform; 
     var matrix = transform.Matrix; 
     scrollcountprevious = scrollcountcurrent; 
     scrollcountcurrent = scrollcountcurrent + e.Delta; 
     // var scale1 = scrollcountcurrent > scrollcountprevious ? 1.1 : scrollcountcurrent <scrollcountprevious0 ? 1.0 : (1.0/1.1); // choose appropriate scaling factor 
     var scale1=1.0; 
     if (scrollcountcurrent > scrollcountprevious) 
     { 
      scale1 = 1.1; 
      matrix.ScaleAtPrepend(scale1, scale1, position.X, position.Y); 
      transform.Matrix = matrix; 
     } 
     else if (scrollcountcurrent < scrollcountprevious&&scrollcountcurrent>=0) 
     { 
      scale1 = 1/1.1; 
      matrix.ScaleAtPrepend(scale1, scale1, previousposition.X, previousposition.Y); 
     transform.Matrix = matrix; 

     } 
     else 
     { 
      scale1 = 1; 
      scrollcountcurrent = 0; 
      matrix.ScaleAtPrepend(scale1, scale1, previousposition.X, previousposition.Y); 
      transform.Matrix = matrix; 
     } 

    } 
+0

@クレメンス以下のxamlを見つけてください。 –

+0

@クレメンス..すみません、私はそれを変更しました。 –

答えて

0

私はあなたが正確に達成しようとしているものを理解していればわかりません。また、ScrollViewerにキャンバスを置くと、物事が混乱する可能性があります。

しかし、おそらく、このマウスホイールハンドラは、あなたが欲しいものを行います。

private double scale = 1; 

private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e) 
{ 
    var element = (UIElement)sender; 
    var position = e.GetPosition(element); 
    var matrix = Matrix.Identity; 

    scale = Math.Max(e.Delta > 0 ? scale * 1.1 : scale/1.1, 1.0); 
    matrix.ScaleAt(scale, scale, position.X, position.Y); 

    ((MatrixTransform)element.RenderTransform).Matrix = matrix; 
} 

もScrollViewerの中にキャンバスの実際のサイズを拡大するためには、そのLayoutTransform代わりRenderTransformの規模:

<Canvas.LayoutTransform> 
    <MatrixTransform/> 
</Canvas.LayoutTransform> 

private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e) 
{ 
    var element = (FrameworkElement)sender; 
    var position = e.GetPosition(element); 
    var matrix = Matrix.Identity; 

    scale = Math.Max(e.Delta > 0 ? scale * 1.1 : scale/1.1, 1.0); 
    matrix.ScaleAt(scale, scale, position.X, position.Y); 

    ((MatrixTransform)element.LayoutTransform).Matrix = matrix; 
} 
+0

これは完全に機能しましたが、キャンバスのスクロールバーは新しい値にスケーリングされません。 scaletransformを使用しようとしましたが、動作しません。 –

+0

RenderTransformの代わりにLayoutTransformを使用してください。 – Clemens

+0

完璧な作業... !!! :) –

関連する問題