【问题标题】:Get the Absolute Origin of an Object when DragStartedEvent fired触发 DragStartedEvent 时获取对象的绝对原点
【发布时间】:2013-01-18 01:03:01
【问题描述】:

我有一个类似于下图所示的应用程序(对不起,我使用的是 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 事件,它将返回手势结束点。

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

【问题讨论】:

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


    【解决方案1】:

    我在 Google 和 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的值都是负数。

    【讨论】:

      【解决方案2】:

      不是 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
      

      附加属性一开始有点混乱,但是一旦你了解了它们的神奇魔法,它们就非常强大且易于使用。

      【讨论】:

      • 谢谢哥们,我现在就试试。顺便说一句,它的 Canvas.GetLeft,所以返回的坐标将是 Canvas 的相对值,对吗?
      • XD 一开始就对不起 iPhone。但我想知道,如果我给背景画布一个名称“canvas”,Canvas.GetLeft 与 canvas.GetLeft 不同吗?
      • @ss1271:呃,我说的是Canvas.GetLeft。是的。放置矩形的画布将使用矩形实例上的附加属性来跟踪它的位置。所以你可以使用 static 方法Canvas.GetLeft 传入你的矩形来获取该属性的当前值。
      • 附加属性实现为 DependencyProperties,在定义它们的类型上具有静态 SetXYZGetXYZ 方法。因此,您不必使用画布实例来获取此属性...只有将您的 Rect 作为孩子保存的 Canvas 才会使用此附加属性。
      • 请耐心等待,我在使用 Canvas.GetLeft(rect)Canvas.GetTop(rect) 时总是得到 (0,0)。矩形下方的画布有x:Name="c"。有什么问题吗?谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多