Я делаю поверхностное приложение, в котором мне нужно масштабировать сцену (масштабирование), пока пользователь масштабирует пальцами (т.е. сжимая)
В настоящее время у меня все работает нормально, но проблема в том, что мне нужно увеличить центральную точку между пальцами пользователей.
Я имею в виду, но математика за переводом трудно понять.
Когда я применяю ScaleTransform
к моей сцене холста, она увеличивается в левом верхнем углу холста, мне нужно, чтобы увеличить центральную точку моего жеста повышения (что, опять же, у меня есть).
Как математика для перевода будет работать, чтобы масштабирование отображалось для увеличения центральной точки жеста?
Изменить:
Это в основном то, что у меня есть:
void Affine2DManipulationDelta(object sender, Affine2DOperationDeltaEventArgs e)
{
//apply zoom and translate
if (e.ScaleDelta != 1)
ApplyZoom(e);
else if (e.Delta.Length != 0)
ApplyTranslation(e);
}
private void ApplyZoom(Affine2DOperationDeltaEventArgs e)
{
//scale
var newScale = _zoomTransform.ScaleX * e.ScaleDelta;
newScale = GetCappedZoomLevel(newScale);
_zoomTransform.ScaleX = newScale;
_zoomTransform.ScaleY = newScale;
}
private void ApplyTranslation(Affine2DOperationDeltaEventArgs e)
{
var xDiff = e.ManipulationOrigin.X - _screenStartPoint.X;
var yDiff = e.ManipulationOrigin.Y - _screenStartPoint.Y;
var translateX = xDiff + _startOffset.X;
var translateY = yDiff + _startOffset.Y;
//bounds testing to limit translation
var rect = new Rect(0.0, 0.0, ZoomCanvas.RenderSize.Width, ZoomCanvas.RenderSize.Height);
Rect bounds = ZoomCanvas.TransformToAncestor(MainViewportCanvas).TransformBounds(rect);
if (CanTranslateX(translateX, bounds))
_translateTransform.X = translateX;
if (CanTranslateY(translateY, bounds))
_translateTransform.Y = translateY;
}
На самом деле довольно просто, но работает до определенной степени ...
_zoomTransform является ScaleTransform
, а _translateTransform является TranslateTransform
MainViewport - это холст, содержащий ZoomCanvas, который является холстом, к которому я применяю преобразования.