2011-07-06 5 views
0

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 clicks a point

user zooms out, what happened here?

after zooming out (all the way out in this case) it looks ok

いじってきたので、私のコードが乱雑に見える場合、私は謝罪します。私はこれがかなり不明瞭な質問であることを知っているので、どんな助けも高く評価されます。

おかげで、 マックス

答えて

1

納期のために誰かがこれに対する答えを探しているなら、私はマウスの右ボタンでパンし、マウスホイールでズームすることで回避策を書く必要がありました。このようにして、ズームは常にイメージの中央付近で行われるので、コントロールは常に並んでいます。私はまだ、誰もが、実際に私がやっているまさに

おかげで、

マックス

0

I変換あなたが悪いのかわからないんだけど、あなたは別の方法を検討していますか?たとえば、透明なキャンバスセットを追加して、イメージと同じサイズ、イメージの上にzオーダー(明示的に設定するか、キャンバスエレメントをイメージエレメントの直後に置く)にすることができます。次に、Canvas.SetLeftとCanvas.SetTopを使用して、ユーザーがクリックした場所にユーザーコントロールを配置し、それを移動できます。トランスフォームを使用するよりもはるかに簡単です。

+0

ザッツをそれを把握することができるかどうかの元の質問への答えを探しています。 2番目のリストにある 'Canvas.SetLeft()'/'Canvas.SetTop()'呼び出しは、あなたが言うことを正確に行っていることに気づくでしょう。問題は、下の画像が拡大縮小されたときにこれらのものを移動する必要があることです。 –

+0

キャンバスに同じScaleTransformを適用すると、画像に作用しないのですか? –

+0

ユーザーが同じポイントを前後にズームインしたりズームアウトしたりしている限り機能します。 'ScaleTransform'には、スケーリングの中心点を決める' CenterX'と 'CenterY'という2つのプロパティがあります。ユーザーが同じポイントでマウスをズームインしたりズームアウトしたりすると、すべてが機能しますが、ユーザーが1点をズームしてマウスを動かしてズームすると、翻訳が正しく機能せず、画像私は私のポストに含まれています。 –