0

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日間いじっていますので、コードが乱雑に見える場合はお詫び申し上げます。私はこれがかなりあいまいな質問であることを知っているので、どんな助けもいただければ幸いです。

ありがとう、マックス

4

2 に答える 2

1

締め切りのため、誰かがこれに対する答えを探している場合は、ユーザーがマウスの右ボタンでパンし、マウスホイールでズームすることで回避策を作成する必要がありました。このように、ズームは常に画像の中央付近で行われるため、コントロールは常に整列しています。誰かがそれを理解できれば、私はまだ元の質問に対する答えを探しています

ありがとう、

マックス

于 2011-07-07T13:35:49.860 に答える
0

変換の何が問題になっているのかわかりませんが、別のアプローチを検討しましたか?たとえば、画像と同じサイズを維持するように透明なキャンバスセットを追加し、画像の上にzオーダーを配置することができます(明示的に設定するか、画像要素の直後にCanvas要素を配置します)。次に、Canvas.SetLeftとCanvas.SetTopを使用して、ユーザーがクリックした場所にユーザーコントロールを配置し、移動することができます。変換を使用するよりもはるかに簡単です。

于 2011-07-06T19:59:48.683 に答える