2017-08-01 94 views
1

我想使用缩放手势也与WPFExtensions.Controls.ZoomControl放大。在此基础上answerWPFExtensions zoomControl可 - 双指缩放是跳跃

- 我知道如何检测缩放手势。我用它作为成员_detector。我使用ZoomControl.ManipulationDelta来进行缩放。

所以我想我只是把ManipulationDelta和缩小这样的:

private void AssociatedObject_ManipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e) 
{ 
    if (_detector.IsScalingAllowed) // this just tells me if it is a pinch gesture or not 
    { 
     if ((e.DeltaManipulation.Scale.X < 1) 
      || (e.DeltaManipulation.Scale.X > 1)) 
     { 
      //AssociatedObject is ZoomControl 
      AssociatedObject.Zoom = Math.Max(e.DeltaManipulation.Scale.X, e.DeltaManipulation.Scale.Y); 
     } 
    } 
} 

但这只会让我ZoomControl变焦相当有穷人和回跳。

我的完整代码如下所示:

public class ZoomBoxBehaviour : Behavior<ZoomControl> 
{ 
    private GestureDetector _detector; 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     if (AssociatedObject != null) 
     { 
      _detector = new GestureDetector(AssociatedObject); 

      if (!AssociatedObject.IsManipulationEnabled) AssociatedObject.IsManipulationEnabled = true; 

      AssociatedObject.ManipulationDelta += AssociatedObject_ManipulationDelta; 
     } 
    } 

    protected override void OnDetaching() 
    { 
     if (AssociatedObject != null) 
     { 
      AssociatedObject.ManipulationDelta -= AssociatedObject_ManipulationDelta; 
     } 

     base.OnDetaching(); 
    } 

    private void AssociatedObject_ManipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e) 
    { 
     if (_detector.IsScalingAllowed) // this just tells me if it is a pinch gesture or not 
     { 
      if ((e.DeltaManipulation.Scale.X < 1) 
       || (e.DeltaManipulation.Scale.X > 1)) 
      { 
       AssociatedObject.Zoom = Math.Max(e.DeltaManipulation.Scale.X, e.DeltaManipulation.Scale.Y); 
      } 
     } 
    } 
} 

你可以从第一个答案的GestureDetectorhere

UPDATE

我把它适当地放大到中心

private void AssociatedObject_ManipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e) 
    { 
     if (_detector.IsScalingAllowed) // this just tells me if it is a pinch gesture or not 
     { 
      if ((e.DeltaManipulation.Scale.X < 1) 
       || (e.DeltaManipulation.Scale.X > 1)) 
      { 
       AssociatedObject.Zoom = Math.Max(e.CumulativeManipulation.Scale.X, e.CumulativeManipulation.Scale.Y); 

       //Size newSize = new Size(AssociatedObject.ZoomBox.Size.Width * e.CumulativeManipulation.Scale.X, 
       //      AssociatedObject.ZoomBox.Size.Height * e.CumulativeManipulation.Scale.Y); 

       //AssociatedObject.ZoomTo(new Rect(new Point(0,0), newSize)); 
      } 
     } 


    } 

但现在我要放大我的手势的中心,但这个评论code只会放大到最大....为什么?

回答

0

我解决了它

public class ZoomBoxBehaviour : Behavior<ZoomControl> 
    { 
     private GestureDetector _detector; 
     protected override void OnAttached() 
     { 
      base.OnAttached(); 
      if (AssociatedObject != null) 
      { 
       _detector = new GestureDetector(AssociatedObject); 

       if (!AssociatedObject.IsManipulationEnabled) AssociatedObject.IsManipulationEnabled = true; 

       AssociatedObject.ManipulationDelta += AssociatedObject_ManipulationDelta; 
      } 
     } 


     protected override void OnDetaching() 
     { 
      if (AssociatedObject != null) 
      { 
       AssociatedObject.ManipulationDelta -= AssociatedObject_ManipulationDelta; 
      } 

      base.OnDetaching(); 
     } 

     private void AssociatedObject_ManipulationStarting(object sender, ManipulationStartingEventArgs e) 
     { 
      e.ManipulationContainer = ((FrameworkElement)e.Source).Parent as FrameworkElement; 
     } 

     private void AssociatedObject_ManipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e) 
     { 
      if (_detector.IsPanningAllowed) 
      { 

       // Limit the X/Y translation extent to prevent the element from 'jumping' when using slow touchscreens, or many touch points. 
       const double translationThreshold = 100.0; 

       //Perform a translation(pan) tranformation 
       if ((e.DeltaManipulation.Translation.X < translationThreshold && 
        e.DeltaManipulation.Translation.X > -translationThreshold) 
       ) 
       { 
        AssociatedObject.TranslateX += e.DeltaManipulation.Translation.X; 
       } 

       if ((e.DeltaManipulation.Translation.Y < translationThreshold && 
        e.DeltaManipulation.Translation.Y > -translationThreshold)) 
       { 
        AssociatedObject.TranslateY += e.DeltaManipulation.Translation.Y; 
       } 
      } 

      if (_detector.IsScalingAllowed) // this just tells me if it is a pinch gesture or not 
      { 
       if ((e.CumulativeManipulation.Scale.X < 1) 
        || (e.CumulativeManipulation.Scale.X > 1)) 
       { 
        AssociatedObject.Zoom = Math.Max(e.CumulativeManipulation.Scale.X, e.CumulativeManipulation.Scale.Y); 
       } 
      } 

     } 

    }