WPFExtensions ZoomControl - 捏缩放是跳跃

时间:2017-08-01 08:05:24

标签: wpf xaml zoom behavior

我想使用捏合手势来缩放WPFExtensions.Controls.ZoomControl

基于此answer - 我知道如何检测捏手势。我将它用作成员_detector。我使用ZoomControl.ManipulationDelta进行缩放。

所以我想我只需要ManipulationDelta和Zoom这样:

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);
            }
        }
    }
}

您可以从第一个答案中获得GestureDetector here

更新

我让它适当缩放到中心

    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只会放大到最大....为什么?

1 个答案:

答案 0 :(得分:1)

我解决了它

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);
                }
            }

        }

    }