2

下の画像のようなアプリを持っています(モックアップのようにiPhoneを使用しました)

img1

アプリには背景として画像があり(視覚的な画面サイズ全体を占めるCanvasを使用して表示されます)、別の形状(この場合は赤い長方形)が背景の上に表示され、ドラッグしてピンチズームできます。

今の質問は

長方形の左上隅の座標(画面の左上隅、つまりキャンバスの左上隅からの原点)を取得するにはどうすればよいですか?


アップデート

@Willの提案によると、私は現在、この場合、次のように長方形の内部をDragDelta使用して長方形を移動します。TranslateTransform

rectTransform.X += e.HorizonalChange;
rectTransform.Y += e.VerticalChange;

長方形は、XAMLではなくコード内で定義されます。

rect.Stroke = new SolidColorBrush(Colors.Green);
rect.StrokeThickness = 10;
rect.Fill = new SolidColorBrush(Colors.Transparent);
rect.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
rect.VerticalAlignment = System.Windows.VerticalAlignment.Center;
rect.Width = 200;
rect.Height = 200;

canvas.Children.Add(rect);

キャンバスはXAML内で定義されます。


私が試したこと

当初、ドラッグイベントの開始時に開始点を取得しようとしていましたが、を使用するDragStarted(object sender, DragStartedGestureEventArgs e)と、タッチされた点の座標のみを出力でき、この長方形の左上隅の点は出力できません。

DragCompletedそして、それはジェスチャーが終了するポイントを私に返すイベントに似ています。

では、赤い長方形の原点座標を取得できる可能性はありますか?

4

2 に答える 2

3

私はほぼ午後をGoogleとMSDNで過ごし、ついにSOでこれを見つけるようになりました。

StackPanel内の要素の位置を取得するにはどうすればよいですか?

同様の方法を使って私を啓発しました。その場合、彼らはUI要素の絶対座標を取得することができました。同様に、私の場合、背景のキャンバスに対する赤い長方形の絶対原点(座標)を知るつもりです。

私が使う:

GeneralTransform gt = canvas.TransformToVisual(rect);
Point currentPos = gt.Transform(new Point(0, 0));

次に、currentPosは長方形の現在の位置(キャンバスに対する絶対位置)です。

そしてこれがMSDNのTransformToVisualのリファレンスです

注意しなければならないことが1つだけあります。それは、XとYの値が負であるということです。

于 2013-01-17T16:10:04.243 に答える
0

ここでの構文は100%確実ではありませんが、WPF(類似している必要があります)では、次のように処理します。

private double _startX, startY, _endX, _endY;
private void DragStarted(object sender, DragStartedGestureEventArgs e)
{
   var rect = sender as UIElement; // I'm assuming the sender is your Rectangle
   this._startX = Canvas.GetLeft(rect);
   this._startY = Canvas.GetTop(rect);
}
private void DragCompleted(object sender, DragCompletedGestureOrWhateverLolEventArgs e)
{
   var rect = sender as UIElement; // I'm assuming the sender is your Rectangle
   this._endX = Canvas.GetLeft(rect);
   this._endY = Canvas.GetTop(rect);
}

あなたが言うこと?タイプセーフではありませんか?ええ、まあ、大丈夫です。長方形にx:Nameを付けて、それをこれらのメソッドで使用するのはどうですか?

<Rectangle x:Name="rect" SkipOtherPropertiesLol="true" />

this._startX = Canvas.GetLeft(rect); //etc

アタッチされたプロパティは、最初は少し混乱しますが、妖精の魔法を理解すれば、非常に強力で使いやすくなります。

于 2013-01-16T16:48:32.167 に答える