Zoom mit Scrollviewer



  • Hallo ich versuche jetzt schon seit Tagen das Zoomen in meiner Anwendung hinzubekommen. Leider vergebens. Und zwar habe ich einen ScrollViewer, in dem sich ein Canvas befindet. Das Zoomen soll sowohl mit den Scrollbars, als auch mit dem MouseWheel funktionieren. Außerdem soll auf die aktuelle Mouseposition gezoomt werden.

    Mein Code:

    public void Zoom(object sender, MouseWheelEventArgs e)
            {
                Point position = e.GetPosition(this);
    
                if (e.Delta > 0)
                    m_dZoomFactor = ZOOMVALUE;
                else
                    m_dZoomFactor = 1.0 / ZOOMVALUE;
    
                double currentZoom = m_ScaleTransform.ScaleX * m_dZoomFactor;
    
                m_ScaleTransform.ScaleX = currentZoom;
                m_ScaleTransform.ScaleY = currentZoom;
            }
    
    void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
            {
                ScrollViewer scrollViewer = sender as ScrollViewer;
                Point actualCursorPosition = System.Windows.Input.Mouse.GetPosition(scrollViewer);
    
                if (e.ExtentHeightChange != 0 || e.ExtentWidthChange != 0)
                {
                    var offsetx = e.HorizontalOffset + actualCursorPosition.X;
                    var offsety = e.VerticalOffset + actualCursorPosition.Y;
                    var oldExtentWidth = e.ExtentWidth - e.ExtentWidthChange;
                    var oldExtentHeight = e.ExtentHeight - e.ExtentHeightChange;
    
                    offsetx = Math.Max(offsetx / oldExtentWidth * e.ExtentWidth - actualCursorPosition.X, 0);
                    offsety = Math.Max(offsety / oldExtentHeight * e.ExtentHeight - actualCursorPosition.Y, 0);
    
                    scrollViewer.ScrollToHorizontalOffset(offsetx);
                    scrollViewer.ScrollToVerticalOffset(offsety);
                }
            }
    

    Das ganze Funktioniert schon recht gut, allerdings nur beim Hineinzoomen. Zoomt man herraus und die Scrollbars verschwinden, so gerät der Canvas aus dem Mousefokus, da der Scrollviewer den Canvas automatisch in der Mitte platziert. Jemand eine Idee wie man das ganze zum Laufen bringen könnte?


Anmelden zum Antworten