WPFExtensions ZoomControl - 捏缩放正在跳跃
WPFExtensions ZoomControl - Pinch zoom is jumping
我想通过 WPFExtensions.Controls.ZoomControl
缩放来使用捏合手势。
基于此answer - 我知道如何检测捏合手势。我用它作为成员_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);
}
}
}
}
您可以从第一个答案中得到 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
只会放大到最大....为什么?
我解决了
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);
}
}
}
}
我想通过 WPFExtensions.Controls.ZoomControl
缩放来使用捏合手势。
基于此answer - 我知道如何检测捏合手势。我用它作为成员_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);
}
}
}
}
您可以从第一个答案中得到 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
只会放大到最大....为什么?
我解决了
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);
}
}
}
}