Windows phone 7 获取触发DragStartedEvent时对象的绝对原点

Windows phone 7 获取触发DragStartedEvent时对象的绝对原点,windows-phone-7,windows-phone-7.1,windows-phone-8,windows-phone,windows-phone-7.1.1,Windows Phone 7,Windows Phone 7.1,Windows Phone 8,Windows Phone,Windows Phone 7.1.1,我有一个应用程序,如下图所示(对不起,我使用了类似iPhone的实体模型) 该应用程序有一个图像作为背景(使用画布显示,画布采用整个视觉屏幕大小),然后另一个形状(本例中为红色矩形)将显示在背景上方,可以拖动和缩放 现在的问题是: 如何获取矩形左上角的坐标(从屏幕左上角开始,即画布左上角开始) 更新 根据@Will的建议,我目前通过DragDelta在其内部使用TranslateTransform移动矩形,如下所示: rectTransform.X += e.HorizonalChange;

我有一个应用程序,如下图所示(对不起,我使用了类似iPhone的实体模型)

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

现在的问题是:

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


更新

根据@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,dragstartedTestureEventArgs e)
,我只能输出被触摸点的坐标,而不能输出该矩形左上角的点

这类似于
DragCompleted
事件,它将返回手势结束的点


那么,有没有可能得到红色矩形的原点坐标呢?

这里的语法不是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" />

附加属性一开始有点让人困惑,但一旦你了解了它们的神奇魔力,它们就非常强大且易于使用。

我在Google和MSDN上花了将近一个下午的时间,最后终于找到了这一点,所以:

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

我使用:

GeneralTransform gt = canvas.TransformToVisual(rect);
Point currentPos = gt.Transform(new Point(0, 0));
然后currentPos是矩形的当前位置(相对于画布的绝对位置)

这是我的参考资料


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

thx伙计,我现在就试试。顺便说一句,它的
Canvas.GetLeft
,因此返回的坐标将是相对于Canvas的,对吗?XD在开始时为iPhone感到抱歉。但是我想知道,Canvas.GetLeft和Canvas.GetLeft是不同的,如果我给背景画布起个名字“Canvas”?@ss1271:嗯,我说的是
Canvas.GetLeft
。是 啊放置矩形的画布将使用矩形实例上的附加属性来跟踪矩形的位置。因此,您可以使用静态方法
Canvas.GetLeft
传入您的rect以获取该属性的当前值。附加属性通过定义它们的类型上的静态方法
SetXYZ
GetXYZ
实现为DependencyProperties。因此,您不必使用画布实例来获取此属性。。。只有将Rect作为子对象保存的画布才会使用此附加属性。请记住,使用
Canvas.GetLeft(Rect)
Canvas.GetTop(Rect)
时,我总是得到(0,0)。矩形下方的画布具有
x:Name=“c”
。有什么问题吗?谢谢
GeneralTransform gt = canvas.TransformToVisual(rect);
Point currentPos = gt.Transform(new Point(0, 0));