C# 在UWP上创建可拖动的映射引脚

C# 在UWP上创建可拖动的映射引脚,c#,uwp,xamarin.forms,draggable,pushpin,C#,Uwp,Xamarin.forms,Draggable,Pushpin,按照此处链接中的说明进行操作后 我有一个半工作的牵引销 当前,地图图钉(网格)在地图上的正确位置开始,但是,在拖动地图图钉时,图钉最初会弹出到屏幕的左上角(0,0),并从这里开始拖动。 在放下pin后,它似乎已断开与地图元素本身的连接,因为您可以滚动地图,并且pin在屏幕上保持不变 我正在使用带有自定义贴图渲染器的Xamarin.Forms。 按照最初的示例,贴图仍然会随着pin拖动而平移,我通过禁用Grid_ManipuationStart上的平移来纠正这一点。 问题似乎在于Grid_Oper

按照此处链接中的说明进行操作后 我有一个半工作的牵引销

当前,地图图钉(网格)在地图上的正确位置开始,但是,在拖动地图图钉时,图钉最初会弹出到屏幕的左上角(0,0),并从这里开始拖动。 在放下pin后,它似乎已断开与地图元素本身的连接,因为您可以滚动地图,并且pin在屏幕上保持不变

我正在使用带有自定义贴图渲染器的Xamarin.Forms。 按照最初的示例,贴图仍然会随着pin拖动而平移,我通过禁用Grid_ManipuationStart上的平移来纠正这一点。 问题似乎在于Grid_OperationDelta函数,因为这是从MapControl子项中删除栅格的原因

我已经把这个问题的视频上传到了YouTube上。可在此处找到:

我的代码如下:

    void IMapControls.startDraggable(Location l) {
        // Create the XAML
        var grid = new Windows.UI.Xaml.Controls.Grid {
            Height=50,
            Width=32,
            Background = new ImageBrush() { ImageSource= new BitmapImage(new Uri("ms-appx:///pin.png",UriKind.RelativeOrAbsolute)),Stretch = Stretch.Uniform },
        };
        grid.ManipulationMode = ManipulationModes.TranslateX|ManipulationModes.TranslateY;
        grid.ManipulationCompleted += Grid_ManipulationCompleted;
        grid.ManipulationStarted += Grid_ManipuationStarted;
        grid.ManipulationDelta += Grid_ManipulationDelta;
        // Set RenderTransform so not null later
        CompositeTransform tran = new CompositeTransform();
        grid.RenderTransform = tran;
        // Add XAML to the map.
        nativeMap.Children.Add(grid);
        Geopoint snPoint = new Geopoint(new BasicGeoposition() { Latitude = l.lat,Longitude = l.lng });
        MapControl.SetLocation(grid,snPoint);
        MapControl.SetNormalizedAnchorPoint(grid,new Windows.Foundation.Point(0.5,1.0));
    }

    private void Grid_ManipuationStarted(Object sender,ManipulationStartedRoutedEventArgs e) {
        nativeMap.PanInteractionMode=MapPanInteractionMode.Disabled;
    }

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

        xform.TranslateX += e.Delta.Translation.X;
        xform.TranslateY += e.Delta.Translation.Y;

        e.Handled = true;
    }

    private void Grid_ManipulationCompleted(object sender,ManipulationCompletedRoutedEventArgs e) {
        nativeMap.PanInteractionMode=MapPanInteractionMode.Auto;
        var grid = sender as Windows.UI.Xaml.Controls.Grid;
        Rect point = grid.TransformToVisual(nativeMap).TransformBounds(new Rect(0,0,grid.Width,grid.Height));
        Geopoint gPoint;
        nativeMap.GetLocationFromOffset(new Windows.Foundation.Point(point.X,point.Y),out gPoint);
        Debug.WriteLine(gPoint.Position.Latitude);
        Debug.WriteLine(gPoint.Position.Longitude);
    }

通过创建网格并将其添加到地图,然后创建图像并将其添加到网格,解决了此问题。如上所述,使用Delta.Translation拖动图像,放置管脚后,它使用MapControl.SetLocation(非TranslateX/Y)将栅格移动到管脚放置的位置,然后将管脚图像平移到0,0(相对于父栅格)。 这是因为网格仅使用SetLocation移动,这似乎工作正常,不会像以前那样断开它与地图的连接。接点相对于栅格移动,与以前一样没有问题,即在启动和断开与贴图对象的连接时移动到0,0

干杯


如果有人感兴趣,可以发布代码,但我认为这是不言自明的。

根据您的视频,您可以在单击pin或地图时初始化pin位置。检查这些侦听器。感谢您的回复。我用网格和图像解决了这个问题。下面是解决方案。我为此奋斗了很长一段时间,终于让它工作了。谢谢你的指点。我在原来的问题上贴了一封邮件。