Frage

Ich muss in der Lage sein, zu vergrößern und aus einer Leinwand das Mausrad verwenden. Ich habe erfolgreich die Mausrad-Handler und bin derzeit mit einer Scaletransform des Zoom anzuwenden einzurichten; jedoch wird die Skalierung nicht in einer „intuitive“ Weise.

Ich versuche, die gleiche Art von „Zoomen“ zu erreichen, wie Sie in Multiscale, Google Maps / Earth oder Adobe Acrobat Reader sehen - aber nicht mit einem Bild, mit einer Kontrolle. Der Übergang muss nicht „glatt“ oder animiert sein (es sei denn, es ist ein einfacher Ansatz), aber die Funktionalität muss die gleiche sein.

Alle Gedanken oder Ideen würden sehr geschätzt und Dank im Voraus!

Edit: Ich habe zu "glatt" der Zoom mit Animation verwaltet:

<Canvas.Resources>
            <Storyboard x:Name="ZoomStoryboard">
                <DoubleAnimation x:Name="ZoomAnimationX"
                                 Storyboard.TargetName="Workspace"
                                 Storyboard.TargetProperty="Canvas.RenderTransform.ScaleTransform.ScaleX"
                                 Duration="0:0:0.2"/>
                <DoubleAnimation x:Name="ZoomAnimationY"
                                 Storyboard.TargetName="Workspace"
                                 Storyboard.TargetProperty="Canvas.RenderTransform.ScaleTransform.ScaleY"
                                 Duration="0:0:0.2"/>
            </Storyboard>
        </Canvas.Resources>

mit dem folgenden Code:

_Zoom += (args.Delta / 7);
if (_Zoom < 0.15)
    _Zoom = 0.15;
ZoomAnimationX.To = _Zoom;
ZoomAnimationY.To = _Zoom;
ZoomStoryboard.Begin();
ZoomScale.Text = _Zoom.ToString("0.00") + "x";
_PreviousMousePosition = _CurrentMousePosition

Allerdings stellt sich die Frage nach wie vor, dass es aus der oberen linken Ecke zoomt, wie auf Websites wie Google Maps Gegensatz wo der Zoom „um“ die Maus ist.

War es hilfreich?

Lösung

Sie benötigen einen gewichteten Durchschnitt als Zoom-Center nutzen basierend auf der Mausposition. Mit anderen Worten, halten Sie das neueste Zoom-Center (oder, wenn Sie eine nicht nur an die aktuellen Mausposition haben noch festgelegt) und halten Sie die Anzahl der Male wurde das Zoomzentrum berechnet (nach dem ersten Zoom, das wäre 1) . Als jedes Mal, wenn Sie das Zoom-Zentrum neu zu berechnen, erhöht, dass var.

Beispiel-Code folgt - deltaZoom ist, wie viel Sie Zoomen, centerX und centerY das aktuelle Zoom-Zentrum ist, ZoomSteps die Anzahl der Male, die wir gezoomt haben, und mouseX und mouseY sind die aktuelle Mausposition:

_Zoom += deltaZoom;
        if (_Zoom <= 0)
            _Zoom = 0.1;

        if (deltaZoom >= 0)
        {
            if (_ZoomSteps == -1)
            {
                _CenterX = 0;
                _CenterY = 0;
                _ZoomSteps = 0;
            }
            else
            {
                _CenterX = (_CenterX * Math.Abs(_ZoomSteps) + mouseX) / (Math.Abs(_ZoomSteps + 1));
                _CenterY = (_CenterY * Math.Abs(_ZoomSteps) + mouseY) / (Math.Abs(_ZoomSteps + 1));
                _ZoomSteps++;
            }
        }
        else
        {
            if (_ZoomSteps == 1)
            {
                _CenterX = 0;
                _CenterY = 0;
                _ZoomSteps = 0;
            }
            else
            {
                _CenterX = (_CenterX * Math.Abs(_ZoomSteps) - mouseX) / (Math.Abs(_ZoomSteps - 1));
                _CenterY = (_CenterY * Math.Abs(_ZoomSteps) - mouseY) / (Math.Abs(_ZoomSteps - 1));
                _ZoomSteps--;
            }
        }

        ZoomAnimationX.To = _Zoom;
        ZoomAnimationY.To = _Zoom;
        CenterAnimationX.To = Math.Abs(_CenterX);
        CenterAnimationY.To = Math.Abs(_CenterY);
        ZoomStoryboard.Begin();

Edited, so dass Sie unter 1,0 Zoomstufe fallen können, aber es gibt noch einige Probleme (ZoomStep = -1, 0 oder 1 manchmal seltsam Shakes verursachen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top