2012-06-22 34 views
2

我正在嘗試使用滑塊來控制放大和縮小任何圖像。如何使用WPF中的滑塊來放大和縮小圖像?

我已經寫了代碼:

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及其控件很陌生,所以對細節的任何幫助都非常感謝。

我該如何實現使用滑塊縮放的相同finoutality?

+0

對我來說,你的代碼看起來不像縮放,更像是用鼠標位置移動(平移)圖像。 – Clemens

回答

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值爲正值,負值取決於鼠標輪或鼠標輪的向下。但是在Slider RoutedPropertyChangesEventsArgs中,根據上下的區域,值是正值或負值。你不需要在這裏指定。只是

zoom = e.NewValue; 

我希望它會有所幫助。

+0

而不是按照相同的值更改縮放比例,您可能想要嘗試'double zoom = e.Delta * .01D;'這將對用戶的操作給出更加動態的響應; –

1

您必須在代碼中編寫ScaleTransform代碼。這是我的代碼的一部分,我不會把所有東西都放在它的基礎上。

對於滑塊,必須將縮放屬性綁定到滑塊的值。

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"); 
    } 
+0

感謝您的回答,但我有一些問題,正如我告訴過你,我對wpf和C sharp非常陌生,而且我需要知道很多關於如何處理圖像處理的某些操作,如傾斜圖像,向左旋轉,將2D轉換爲3D。使用鼠標放大並使用滑塊等,你可以幫助我適當的指導,一些鏈接或電子書,這將是偉大的。你能告訴我你是什麼意思的「將縮放屬性綁定到滑塊的值」?如果你真的不介意,你可以簡單地解釋你的代碼。我是新的,但真的非常感興趣的WPF和C銳 – Debhere

+0

經過大量的搜索和編碼,我發現它的一個非常簡單的應用程序和非常簡單的編碼,Zoomin使用滑塊縮小圖像。 – Debhere