我有一个类似下图所示的应用程序(对不起,我使用了像模拟一样的iPhone)
应用程序有一个图像作为背景(使用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
事件,它会让我回到手势结束的位置。
那么我有没有机会得到红色矩形的原点坐标?
答案 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是矩形的当前位置(它相对于画布的绝对位置)。
的参考资料只有一件事要注意: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
附加属性起初有点令人困惑,但是一旦你理解了它们的神仙魔法,它们就会变得非常强大和易于使用。