3

Silverlight MainWindow.xaml ファイルから Shapes.Path オブジェクトに沿ってポイントを取得しようとしています。Expression Blend を使用してパスを作成します。

次のコードは、マージンのみを移動する式ブレンドでパスを移動しようとしない限り、正常に機能します。どうやらそれは計算されず、パスが最初に作成された場所からポイントを取得します。

        var pathGeometry = path.Data.GetFlattenedPathGeometry();
        var currentPoint = new System.Windows.Point();
        var tangentPoint = new System.Windows.Point();
        var rList = new List<Point>();
        var pointsCount = 10;
        for (int i = 0; i < pointsCount; i++)
        {                
            double fraction = (double)i / (double)(pointsCount - 1);

            pathGeometry.GetPointAtFractionLength(fraction, out currentPoint, out tangentPoint);

            rList.Add(currentPoint);
        }
        return rList;

マージンの変更を計算する方法について何か提案はありますか?

4

1 に答える 1

3

ああ...私は問題を見たと思います。PathGeometryは UIElement から継承されません。つまり、マージンの意味がありません。Geometry はそれを行うコントロール内でホストされ、Geometry を実際に画面に描画するのはそのコントロールです。Geometry 上のポイントを画面座標に変換する場合は、ホスト コントロールの位置を見つけてオフセットを計算する必要があります。

私の推測では、あなたの PathGeometry はPathコントロール内でホストされています。(紛らわしいですよね?) 画面座標で位置を取得するのは比較的簡単です。Path でPointToScreenメソッドを呼び出して、計算されたポイントをフィードすることができます (おそらく、適用するパディングを追加します)。ウィンドウに相対的なポイントを取得するのはより複雑です。ウィンドウで (ポイント 0,0 の) PointToScreen を呼び出してから、ウィンドウのポイントからパスのポイントを差し引くことができます。または、Path を Canvas 内 (Canvas が直接ウィンドウ内にある場所) に配置し、単純に Canvas.Top と Canvas.Left を取得することもできます。

最終的な目標が何であるかを言わないので、特定のソリューションを推奨することは困難です。

于 2012-07-03T17:40:06.783 に答える