2

キャンバス上の描画を拡大するとき、スクロールバーを表示する必要があります。
キャンバスは ScrollViewer 内にあり、キャンバスの幅/高さを増やして、スクロール バーが表示されるようにします (それ以外の場合は表示されません)。

倍率 1.1 でズームインするには、次のコードを使用します。

Matrix m = this.LayoutTransform.Value;
if (e.Delta > 0) f = 1.1;
else f = 1.0 / 1.1;
m.Scale(f, f);
this.LayoutTransform = new MatrixTransform(m);
this.Height = this.ActualHeight * f;
this.Width = this.ActualWidth * f;

Canvas が大きくなりすぎることがわかりました。図面は10%ズームインしていますが、幅は1.1の正方形のように20%増しになっているようです。だから私はMath.Sqrt(f);の代わりに使用しfます。

なぜこのように動作するのか、誰か説明できますか?

4

1 に答える 1

1

次の簡単な例のように、Canvas の LayoutTransform のみを変更する必要があります。

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
    <Canvas Width="1000" Height="1000" Background="Transparent"
            MouseWheel="Canvas_MouseWheel">
        <Canvas.LayoutTransform>
            <MatrixTransform/>
        </Canvas.LayoutTransform>
    </Canvas>
</ScrollViewer>

MouseWheel イベント ハンドラー:

private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e)
{
    var element = (FrameworkElement)sender;
    var transform = (MatrixTransform)element.LayoutTransform;
    var matrix = transform.Matrix;
    var scale = e.Delta >= 0d ? 1.1 : (1d / 1.1);

    matrix.Scale(scale, scale);
    transform.Matrix = matrix;

    e.Handled = true;
}
于 2014-03-04T11:47:37.947 に答える