Cómo mantener el área del lienzo centrada en un ScrollViewer cuando se acerca o aleja, y no todo se puede mostrar en la ventana de visualización

Todo el mundo

Tengo una aplicación WPF que tiene un lienzo que he envuelto en un visor de desplazamiento. Tengo un control deslizante en la barra de estado que permite al usuario acercar y alejar (al igual que mspaint de Win 7).

Aquí hay algunos de los XAML:

<ScrollViewer Name="Map"
              VerticalScrollBarVisibility="Auto"
              HorizontalScrollBarVisibility="Auto">
    <Canvas x:Name="WallsCanvas" Height="800" Width="1000" ClipToBounds="True">
        <Canvas.LayoutTransform>
            <ScaleTransform x:Name="WallsCanvasScale"
                            ScaleX="1" ScaleY="1" />
        </Canvas.LayoutTransform>
    </Canvas>
</ScrollViewer>

Cuando acerco, y las barras de desplazamiento son visibles, las barras de desplazamiento, sin importar dónde estén configuradas, saltan al medio.

s exactamente como si el valor de las barras de desplazamiento permaneciera igual pero el valor máximo aumenta.

¿Qué puedo hacer para que ... digan, si estuvieran en la esquina inferior derecha, para permanecer en la esquina inferior derecha después de acercar o alejar?

BTW, aquí está mi código para acercar y alejar:

private void SliderValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    var scales = new []{.125, .25, .5, 1, 2, 4, 8};
    var scale = scales[(int)((Slider) sender).Value];

    ScaleChanged(scale, WallsCanvasScale);
}

private static void ScaleChanged(double scale, ScaleTransform st)
{
    st.ScaleX = scale;
    st.ScaleY = scale;
}

Entonces, no hay ciencia de cohetes en mi código pero ...

Actualizar idea: si tuviera acceso al valor y al valor máximo de las barras de desplazamiento, ¿podría obtener el porcentaje entre los dos y luego, después del zoom (escala), podría volver a aplicar el valor de la barra de desplazamiento como un porcentaje del ¿¿¿¿¿valor máximo????? Pero, ¿dónde está disponible el valor y el valor máximo?

Cualquier ayuda sería apreciada. No puedo pensar que soy el único que tiene este problema ya que MSPaint (la versión de Windows 7) funciona correctamente y supongo que es una aplicación XAML.

Aquí hay unaenlaza (http://www.leesaunders.net/examples/zoomexample/zoomexample.zip) a un proyecto mínimo de trabajo de ejemplo (VS 2010). Cuando lo ejecute, simplemente mueva las barras de desplazamiento y luego amplíe un nivel, verá el problema de inmediato.

Respuestas a la pregunta(1)

Su respuesta a la pregunta