2

我有一个应用程序,如下图所示(抱歉,我使用的是 iPhone 样机)

图像1

该应用程序有一个图像作为背景(使用 Canvas 显示,它采用整个可视屏幕大小),然后另一个形状(在本例中为红色矩形)将显示在背景上方,可以拖动和缩放缩放。

现在的问题是

如何获取矩形左上角的坐标(从屏幕左上角开始,即画布的左上角)?


更新

根据@Will 的建议,我目前在这种情况下通过在其中使用来移动矩形DragDeltaTranslateTransform例如:

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 中定义。


我试过的

最初我试图在 Drag 事件开始时获取起点,但是通过使用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的参考

只有一件事需要注意: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 回答