2

スライダーを使用して、画像のズームインとズームアウトを制御しようとしています。

私はコードを書きました:

  private void image1_MouseMove(object sender, MouseEventArgs e)
        {
           if (!image1.IsMouseCaptured) return;
            var tt = (TranslateTransform)((TransformGroup)
      image1.RenderTransform).Children.First(tr => tr is TranslateTransform);
            Vector v = start - e.GetPosition(border1);
            tt.X = origin.X - v.X;
            tt.Y = origin.Y - v.Y;
        }

ここでは正常に動作しています。マウススクロールを使用します。しかし、私は同じ機能のためにスライダーを使用したいと思います。

しかし、スライダーを使用したマウススクロールのような同じ動作をすることはできません。私はWPFとその制御に非常に慣れていないので、詳細についてのヘルプは大歓迎です。

スライダーを使用して、ズームインとズームアウトの同じ機能を実装するにはどうすればよいですか?

4

2 に答える 2

3

多くの調査とコーディングの結果、スライダーを使用して画像をズームインおよびズームアウトするための非常にシンプルなアプリケーションと非常にシンプルなコーディングであることがわかりました。必要なのは、選択した領域にスライダーを配置することです。次のコードを入力します。

private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        TransformGroup transformGroup = (TransformGroup)image1.RenderTransform;
        ScaleTransform transform = (ScaleTransform)transformGroup.Children[0];

        double zoom = e.NewValue; 
        transform.ScaleX = zoom;
        transform.ScaleY = zoom;
    }

これで、画像がマウスホイールを使用してズームインおよびズームインするように、コードがすでに作成されています。

    private void image1_MouseWheel(object sender, MouseWheelEventArgs e)
    {
        TransformGroup transformGroup = (TransformGroup)image1.RenderTransform;
        ScaleTransform transform = (ScaleTransform)transformGroup.Children[0];

        double zoom = e.Delta > 0 ? .2 : -.2;
        transform.ScaleX += zoom;
        transform.ScaleY += zoom;

        slider1.Value += zoom; 
    }

今あなたが置くとき

   slider1.value += zoom;

次に、マウスホイールを変更し、スライダーを変更すると、画像のズームが変更されます。

マウスホイールとスライダーの実装の違いを覚えておいてください。マウスホイールでは、MouseWheelEventsArgs "e"およびe.Delte値は正であり、負はマウスホイールのアップまたはマウスホイールのダウンに依存します。ただし、スライダーのRoutedPropertyChangesEventsArgsの値は、スライダーの上下に応じて正または負になります。ここで指定する必要はありません。ただ

 zoom = e.NewValue;

お役に立てば幸いです。

于 2012-07-09T13:37:37.857 に答える
1

コードにScaleTransformをコーディングする必要があります。これはこれを行う私のコードの一部です。すべてを入れるわけではありませんが、それはあなたのベースです。

スライダーの場合、Zoomプロパティをスライダーの値にバインドする必要があります。

  private double m_dCurZoom = 1.0;
  private ScaleTransform m_transZoom;
  public ScaleTransform TransZoom
  {
     get { return m_transZoom; }
  }

  private TranslateTransform m_transPan;

  public double Zoom
  {
     get { return m_dCurZoom; }
     set
     {
        double oldzoom = m_dCurZoom;
        if (m_dCurZoom != value)
        {
           m_dCurZoom = value;
           OnPropertyChanged("Zoom");
           UpdateZoom(oldzoom);
        }
     }
  }

  public void UpdateZoom(double oldzoom)
  {
     // Are we visible?
     if (m_root == null)
        return;

     // Get parent
     FrameworkElement parent = GetRootParent();
     if (parent == null)
         return;

     // Center point of the window
     Point ptCenter = new Point(parent.RenderSize.Width / 2, parent.RenderSize.Height / 2);

     // Translate into canvas coordinates
     ptCenter = m_root.TranslatePoint(ptCenter, m_canvas);

     // Update the zoom
     m_transZoom.ScaleX = m_dCurZoom;
     m_transZoom.ScaleY = m_dCurZoom;
     m_transPan.X -= ptCenter.X * m_dCurZoom - ptCenter.X * oldzoom;
     m_transPan.Y -= ptCenter.Y * m_dCurZoom - ptCenter.Y * oldzoom;

     ResizeElementContents();

     OnPropertyChanged("Zoom");
  }
于 2012-06-22T13:25:33.013 に答える