在DragStartedEvent触发时获取对象的绝对原点

时间:2013-01-16 16:13:44

标签: windows-phone-7 windows-phone-7.1 windows-phone-8 windows-phone windows-phone-7.1.1

我有一个类似下图所示的应用程序(对不起,我使用了像模拟一样的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中定义。


我尝试了什么

最初我试图在Drag事件开始时获取起始点,但是通过使用DragStarted(object sender, DragStartedGestureEventArgs e),我只能输出被触摸的点的坐标,但不能输出顶部的点 - 这个矩形的左角。

它类似于DragCompleted事件,它会让我回到手势结束的位置。

那么我有没有机会得到红色矩形的原点坐标?

2 个答案:

答案 0 :(得分:3)

我花了将近一个下午的时间在谷歌和MSDN上,然后终于在SO上找到了这个:

How to get the position of an element in a StackPanel?

使用类似的方法启发了我。在这种情况下,他们设法获得UI元素的绝对坐标。类似地,在我的情况下,我打算知道红色矩形到背景画布的绝对原点(坐标)。

我用:

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

然后currentPos是矩形的当前位置(它相对于画布的绝对位置)。

以下是TransformToVisual in MSDN

的参考资料

只有一件事要注意:X和Y的值是负的。

答案 1 :(得分: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

附加属性起初有点令人困惑,但是一旦你理解了它们的神仙魔法,它们就会变得非常强大和易于使用。