Silverlight 3-キャンバスを拡大するScaleTransformまたは他の方法?
-
06-07-2019 - |
質問
マウスホイールを使用して、キャンバスをズームインおよびズームアウトできるようにする必要があります。マウスホイールハンドラーのセットアップに成功し、現在、ScaleTransformを使用してズームを適用しています。ただし、スケーリングは「直感的」に行われません。方法。
同じスタイルの「ズーム」を達成しようとしています。 MultiScaleImage、Google Maps / Earth、またはAdobe Acrobat Readerで見ることができますが、画像ではなく、コントロールがあります。移行は「スムーズ」である必要はありません。またはアニメーション(簡単な方法でない限り)ですが、機能は同じである必要があります。
どんな考えやアイデアも高く評価され、事前に感謝します!
編集:「スムーズ」に管理しましたアニメーションを使用したズーム:
<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>
次のコードを使用:
_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
ただし、Googleマップなどのズームが「周り」にあるサイトとは対照的に、左上隅からズームアウトするという問題が依然として発生します。マウス。
解決
マウスの位置に基づいて、ズームセンターとして加重平均を使用する必要があります。つまり、最新のズームセンターを保持し(まだ持っていない場合は、現在のマウス位置に設定するだけです)、ズームセンターが計算された回数を保持します(最初のズーム後は1になります) 。ズームセンターを再計算するたびに、その変数を増やします。
コードの例-deltaZoomはズーム量、centerXとcenterYは現在のズームの中心、ZoomStepsはズームした回数、mouseXとmouseYは現在のマウスの位置です:
_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();
1.0ズームレベルより下にドロップできるように編集しましたが、まだいくつかの問題があります(ZoomStep = -1、0または1は時々奇妙な揺れを引き起こします)。