Je fais une application de surface où je dois escalader ma scène (zoom) pendant que l'utilisateur échelles avec leurs doigts (c.-à-pincements)Comment calculer traduire tout en effectuant un zoom avant WPF/Surface
Actuellement, je l'ai travail ok, mais le problème est que je dois zoomer sur le point central entre les doigts des utilisateurs. J'ai le point, mais les maths derrière la traduction sont difficiles à comprendre. Lorsque j'applique un ScaleTransform
à ma scène de toile, il zoome en haut à gauche de la toile, j'en ai besoin pour zoomer sur le point central de mon geste de pincement (ce que, encore une fois, j'ai).
Comment les maths de la traduction fonctionneraient-ils pour que le zoom apparaisse pour faire un zoom avant sur le point central du mouvement?
Edit:
Ceci est essentiellement ce que j'ai:
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;
}
vraiment basique Jolie, mais il fonctionne à un point ...
_zoomTransform est un ScaleTransform
et _translateTransform est un TranslateTransform
MainViewport est une toile qui contient ZoomCanvas qui est le canevas auquel j'applique les transformations.
Juste quelques questions, est '' Scale', CanPan' et 'CanScale' seulement des propriétés personnalisées? Ou avez-vous étendu un 'ScrollViewer'? Est-ce que l'utilisation de scrollviewer serait plus facile qu'avec des traductions X et Y? – Mark