WPFのレンダリングトランスフォームで奇妙な問題が発生しました。私が取り組んでいるプロジェクトは、クリックされたユーザーポイントをイメージに表示する必要があります。ユーザーがポイントをクリックすると、カスタムコントロールがそのクリック位置に配置されます。マウスホイールを使用して画像を任意の点で拡大縮小することができます。また、カスタムコントロールは、(換算されていません)の正しい位置にを翻訳する必要があります。次のようにWPFレンダリングトランスフォームの動作が奇妙
はこれを行うために、私はマウスホイールイベントは、次のとおり
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日間これで
user zooms out, what happened here?
after zooming out (all the way out in this case) it looks ok
いじってきたので、私のコードが乱雑に見える場合、私は謝罪します。私はこれがかなり不明瞭な質問であることを知っているので、どんな助けも高く評価されます。
おかげで、 マックス
ザッツをそれを把握することができるかどうかの元の質問への答えを探しています。 2番目のリストにある 'Canvas.SetLeft()'/'Canvas.SetTop()'呼び出しは、あなたが言うことを正確に行っていることに気づくでしょう。問題は、下の画像が拡大縮小されたときにこれらのものを移動する必要があることです。 –
キャンバスに同じScaleTransformを適用すると、画像に作用しないのですか? –
ユーザーが同じポイントを前後にズームインしたりズームアウトしたりしている限り機能します。 'ScaleTransform'には、スケーリングの中心点を決める' CenterX'と 'CenterY'という2つのプロパティがあります。ユーザーが同じポイントでマウスをズームインしたりズームアウトしたりすると、すべてが機能しますが、ユーザーが1点をズームしてマウスを動かしてズームすると、翻訳が正しく機能せず、画像私は私のポストに含まれています。 –