WPFのレンダリング変換で奇妙な問題が発生しています。私が取り組んでいるプロジェクトでは、クリックしたユーザーポイントを画像の上に表示する必要があります。ユーザーがポイントをクリックすると、クリックした場所にカスタムコントロールが配置されます。次に、マウスホイールを使用して画像を任意のポイントの周りで拡大縮小できるようにし、カスタムコントロールを正しい位置に変換(拡大縮小ではない)する必要があります。
これを行うには、次のようにMouseWheelイベントをフォローします。
private void MapPositioner_MouseWheel(object sender, MouseWheelEventArgs e)
{
Point location = Mouse.GetPosition(MainWindow.Instance.imageMap);
MainWindow.Instance.imageMap.RenderTransform = null;
ScaleTransform st = new ScaleTransform(scale + (e.Delta < 0 ? -0.2 : 0.2), scale += (e.Delta < 0 ? -0.2 : 0.2));
st.CenterX = location.X;
st.CenterY = location.Y;
TransformGroup tg = new TransformGroup();
tg.Children.Add(st);
//tg.Children.Add(tt);
MainWindow.Instance.imageMap.RenderTransform = tg;
if (scale <= 1)
{
MainWindow.Instance.imageMap.RenderTransform = null;
}
if (TransformationChanged != null)
TransformationChanged();
}
TransformationChanged
次に、上記のコードブロックの最後に表示されるイベントのカスタムコントロールに、次のようにイベントハンドラーを実装しました。
private void Instance_TransformationChanged()
{
//check image coords
//
if (MainWindow.Instance.imageMap.RenderTransform != null)
{
if (MainWindow.Instance.imageMap.RenderTransform != Transform.Identity)
{
Transform st = MainWindow.Instance.imageMap.RenderTransform;
Point image = MainWindow.VideoOverlayCanvas.TransformToVisual(MainWindow.Instance.MapImage).Transform(loc2);
Point trans = st.Transform(image);
Point final = MainWindow.Instance.MapImage.TransformToVisual(MainWindow.VideoOverlayCanvas).Transform(trans);
// selected = anchor2;
// final = ClipToOverlay(final);
// selected = null;
connector.X2 = final.X;
connector.Y2 = final.Y;
Canvas.SetLeft(anchor2, final.X);
Canvas.SetTop(anchor2, final.Y);
}
}
else
{
connector.X2 = loc2.X;
connector.Y2 = loc2.Y;
Canvas.SetLeft(anchor2, loc2.X);
Canvas.SetTop(anchor2, loc2.Y);
}
}
このようにして、新しい変換が設定された後にのみ、カスタムコントロールの位置が更新されるようにすることができます。ポイントに変換を適用しているため、コントロールにスケーリングは行われないことに注意してください。効果は、ポイントに変換されることです。これは、ユーザーが1ポイントを中心にスケーリングしている限り正常に機能します。彼らがその点を変えるならば、それは働きません。問題を示すいくつかの画像は次のとおりです。
ズームアウトした後(この場合は完全にズームアウト)、問題ないように見えます
私はこれを約2日間いじっていますので、コードが乱雑に見える場合はお詫び申し上げます。私はこれがかなりあいまいな質問であることを知っているので、どんな助けもいただければ幸いです。
ありがとう、マックス