C# 如何在windows 10中创建可拖动的pin以提供拾取位置功能?

C# 如何在windows 10中创建可拖动的pin以提供拾取位置功能?,c#,windows-10-universal,C#,Windows 10 Universal,我正在Windows 10中使用MapControl,我希望允许用户拖动pin,当用户删除pin时,我希望使用API获取该位置的纬度和经度,并获取位置地址 MapControl map = frameworkElement as MapControl; map.MapServiceToken= "my service token"; BasicGeoposition councilPosition = new BasicGeoposition() { Latitude = Conver

我正在Windows 10中使用MapControl,我希望允许用户拖动pin,当用户删除pin时,我希望使用API获取该位置的纬度和经度,并获取位置地址

MapControl map = frameworkElement as MapControl;
map.MapServiceToken= "my service token";
BasicGeoposition councilPosition = new BasicGeoposition()
{
     Latitude = Convert.ToDouble(Info.GetType().GetRuntimeProperty("LATITUDE").GetValue(councilInfo, null)),
     Longitude = Convert.ToDouble(Info.GetType().GetRuntimeProperty("LONGITUDE").GetValue(councilInfo, null))
};

Geopoint pinPoint = new Geopoint(councilPosition);

MapIcon locationPin = new MapIcon();
locationPin.Image= RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Images/pushpin.png"));
locationPin.Title = councilInfo.COUNCIL_NAME;
locationPin.CollisionBehaviorDesired = MapElementCollisionBehavior.RemainVisible;
locationPin.Location = councilPoint;
locationPin.NormalizedAnchorPoint = new Point(0.5, 1.0);
locationPin.ZIndex = 0;

map.MapElements.Add(locationPin);
await map.TrySetViewAsync(locationPin.Location, 15D, 0, 0, MapAnimationKind.Bow);
有人能建议需要使用哪些事件来实现拾取位置功能吗?

请参阅此。它们使用XAML指定了显示点。您可以使用带有背景图钉图像的栅格,而不是边框,而是侦听该栅格的操纵事件

下面是实现我上面所说的功能的代码

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            BasicGeoposition snPosition = new BasicGeoposition() { Latitude = 47.7356039173901, Longitude = -122.310697222129

            };
            Geopoint snPoint = new Geopoint(snPosition);

            // Create a XAML border.
            Grid grid = new Grid
            {
                Width=100,
                Height=100,
                Background = new ImageBrush() {ImageSource= new BitmapImage(new Uri("ms-appx:///Assets/icon.png", UriKind.RelativeOrAbsolute)), Stretch = Stretch.UniformToFill}
            };
              grid.ManipulationMode = ManipulationModes.TranslateX|ManipulationModes.TranslateY;
 grid.ManipulationCompleted += Grid_ManipulationCompleted;
            grid.ManipulationDelta +=Grid_ManipulationDelta;
            // Center the map over the POI.
            MapControl1.Center = snPoint;
            MapControl1.ZoomLevel = 14;
            CompositeTransform tran = new CompositeTransform();
            grid.RenderTransform = tran;
            // Add XAML to the map.
            MapControl1.Children.Add(grid);
            MapControl.SetLocation(grid, snPoint);
            MapControl.SetNormalizedAnchorPoint(grid, new Point(0.5, 0.5));
        }  

        private void Grid_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
        {
            Grid grid = sender as Grid;
            CompositeTransform xform = grid.RenderTransform as CompositeTransform;


            xform.TranslateX += e.Delta.Translation.X;
            xform.TranslateY += e.Delta.Translation.Y;
         //   Rect point = grid.TransformToVisual(MapControl1).TransformBounds(new Rect(0,0, grid.Width, grid.Height));

            e.Handled = true;
          //  Geopoint gPoint;
           // MapControl1.GetLocationFromOffset(new Point(point.X, point.Y), out gPoint);
           // Debug.WriteLine(gPoint.Position.Latitude);
           // Debug.WriteLine(gPoint.Position.Longitude);
        }

  private void Grid_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
        {
            Grid grid = sender as Grid;
            Rect point = grid.TransformToVisual(MapControl1).TransformBounds(new Rect(0, 0, grid.Width, grid.Height);
            Geopoint gPoint;
            MapControl1.GetLocationFromOffset(new Point(point.X, point.Y), out gPoint);
            Debug.WriteLine(gPoint.Position.Latitude);
            Debug.WriteLine(gPoint.Position.Longitude);
        }

拖动后获取的位置不太准确。你可以对如何将accuarate point wrt提取到地图控制进行一些研究和开发,我无法得到公认的答案。经过大量的研究和帮助,我终于让它工作了。以下是一个工作示例:

    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            InitializeComponent();

            var position = new Geopoint(new BasicGeoposition
            {
                Latitude = 30.3618,
                Longitude = -91.1067
            });
            var grid = new Grid
            {
                Width = 32,
                Height = 50
            };
            var pushpin = new Image()
            {
                Source = new BitmapImage(new Uri("ms-appx:///Assets/Pushpin.png")),
                Stretch = Stretch.Uniform,
                ManipulationMode = ManipulationModes.TranslateX | ManipulationModes.TranslateY,
                RenderTransform = new TranslateTransform()
            };
            pushpin.ManipulationStarted += Pushpin_ManipulationStarted;
            pushpin.ManipulationDelta += Pushpin_ManipulationDelta;
            pushpin.ManipulationCompleted += Pushpin_ManipulationCompleted;
            grid.Children.Add(pushpin);

            Map.Center = position;
            Map.Children.Add(grid);
            MapControl.SetLocation(grid, position);
            MapControl.SetNormalizedAnchorPoint(grid, new Point(0.5, 1));
        }

        private Geopoint GetPosition(Image pushpin)
        {
            var grid = pushpin.Parent as Grid;
            var anchor = MapControl.GetNormalizedAnchorPoint(grid);
            var offset = pushpin.TransformToVisual(Map).TransformPoint(new Point(grid.Width * anchor.X, grid.Height * anchor.Y));
            Map.GetLocationFromOffset(offset, out Geopoint position);
            return position;
        }

        private void Pushpin_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
        {
            Map.PanInteractionMode = MapPanInteractionMode.Auto;

            var pushpin = sender as Image;
            var grid = pushpin.Parent as Grid;
            var position = GetPosition(pushpin);
            MapControl.SetLocation(grid, position);
            var transform = pushpin.RenderTransform as TranslateTransform;
            transform.X = 0;
            transform.Y = 0;
        }

        private void Pushpin_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
        {
            var pushpin = sender as Image;
            var transform = pushpin.RenderTransform as TranslateTransform;
            transform.X += e.Delta.Translation.X;
            transform.Y += e.Delta.Translation.Y;
        }

        private void Pushpin_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
        {
            Map.PanInteractionMode = MapPanInteractionMode.Disabled;
        }
    }

让我给你一个想法。请参阅此链接。它们使用XAML指定了显示点。您可以使用带有背景图钉图像的网格,而不是边框,而是侦听该网格的操纵事件。。这有助于满足您的要求吗?MapIcon不可能吗?我想允许用户拖动MapIcon并将其放到其他位置,当用户拖放时,可以使用纬度和纬度获取位置。我想不会。因为mapicon没有要注册的拖动事件或操作事件。但我还没有做过这方面的工作,好吧,实际上我过去也没有做过操纵事件,所以不知道如何使用它们进行拖放。你能在样本中添加答案吗?如果它符合我的要求,我会将答案标记为“是”,并奖励赏金。谢谢,我会尝试一下。好的。如果有任何问题,请告诉我该事件被多次调用。它显示许多位置。是吗?是的。您想要的是在完成拖动后获取位置,对吗?我会更新答案是的,图标就是图像,它会指向网格内的完美坐标吗?如果我添加图像作为网格的子元素,那么它会工作吗?