WP7在地图上拖动图钉

时间:2011-09-29 00:27:56

标签: silverlight-4.0 bing-maps windows-phone-7.1

有没有人了解如何在运行Mango的WP7客户端上的地图上实现可拖动的图钉?我有一个图钉绑定到地图上的地理位置,我希望用户能够将其拖动到地图上并记录其新位置。我见过一些资源,但它们用于非WP7 Bing Maps控件。任何帮助将不胜感激。

谢谢!

4 个答案:

答案 0 :(得分:1)

e.GetPosition(element)给出相对于参数传递的元素的位置。此外,使用ViewportPointToLocation转换的点必须相对于地图的位置。因此,您必须执行以下操作:

    Pushpin myPin = sender as Pushpin;
    Point p = e.GetPosition(**Map**);
    g = Map.ViewportPointToLocation(p);

答案 1 :(得分:1)

我知道这是一个迟到的回应,但我正在研究一个类似的项目并使用类似的方法,所以我想我会分享。这是我的第一篇文章,对我来说很光,但我使用的方法是:

创建两个全局双变量来保存X,Y坐标:

double mapLocX;
double mapLocY;

将这些全局双打设置为DragStarted事件中图钉点的位置:

Point point = myMap.LocationToViewportPoint(myPin.Location);
mapLocX = point.X;
mapLocY = point.Y;

在dragDelta事件中,将这些变量更改为您的图钉:

mapLocX += e.HorizontalChange;
mapLocY += e.VerticalChange;

现在,在DragCompleted上创建一个新点,它接收我们渲染的全局变量,并将它们映射到地理坐标,这里是踢球者;从ObservableCollection(Mine is Locations)中删除我们的旧引脚,并在我们的新坐标处添加一个新图钉:

Point point = new Point(mapLocX, mapLocY);
GeoCoordinate geoCoord = new GeoCoordinate();
geoCoord = myMap.ViewportPointToLocation(point);

Locations.Remove(myPin.Location);
Locations.Add(geoCoord);

希望这有帮助

答案 2 :(得分:0)

如果有人好奇,这就是我提出的解决方案:

XAML:

<map:Map x:Name="Map" Height="400" HorizontalAlignment="Left" Margin="6,10,0,0" VerticalAlignment="Top" Width="444" ZoomLevel="19" >
     <map:Map.Mode><map:AerialMode /></map:Map.Mode>
     <map:Pushpin x:Name="Pin" Background="Green" IsHitTestVisible="True" IsEnabled="True">
         <toolkit:GestureService.GestureListener>
              <toolkit:GestureListener DragDelta="Pushpin_OnDragDelta" DragStarted="Pushpin_OnDragStarted" DragCompleted="Pushpin_OnDragCompleted">
              </toolkit:GestureListener>
         </toolkit:GestureService.GestureListener>
     <map:Pushpin.RenderTransform>
          <TranslateTransform></TranslateTransform>
     </map:Pushpin.RenderTransform>
     </map:Pushpin>
</map:Map>

的.cs:

private void Pushpin_OnDragDelta(object sender, DragDeltaGestureEventArgs e)
{
   Pushpin myPin = sender as Pushpin;
   TranslateTransform transform = myPin.RenderTransform as TranslateTransform;
   transform.X += e.HorizontalChange;
   transform.Y += e.VerticalChange;                                  
}

private void Pushpin_OnDragStarted(object sender, DragStartedGestureEventArgs e)
{
   Map.IsEnabled = false; // prevents the map from dragging w/ pushpin
}

private void Pushpin_OnDragCompleted(object sender, DragCompletedGestureEventArgs e)
{
   Map.IsEnabled = true;           
}

有没有人对如何提取图钉的新位置的地理坐标有任何想法?我在事件处理程序中尝试了下面的代码,它没有给出正确的坐标:

 Pushpin myPin = sender as Pushpin;
 Point p = e.GetPosition(myPin);
 g = Map.ViewportPointToLocation(p);

myPin.location提供旧坐标

答案 3 :(得分:0)

您希望UI元素的原点不是您的手指吗?试试这个:

Point pM = e.GetPosition(**Map**);
Point pE = e.GetPosition(**UIElement**);

Point origin = new Point(pM.X - pE.X, pM.Y - pE.Y);
GeoCoordinate g = Map.ViewportPointToLocation(origin);