按照链接中的说明进行操作How to create draggable pin in windows 10 to give pick location functionality?
我有一半正在工作的图钉。

当前,地图图钉(网格)从地图上的正确位置开始,但是,拖动地图图钉时,该图钉最初会弹出到屏幕的左上角(0,0),然后从此处开始拖动。
放下图钉后,您似乎已与地图元素本身断开连接,然后您可以滚动地图,图钉会停留在屏幕上的适当位置。

我正在将Xamarin.Forms与自定义地图渲染器一起使用。
在原始示例之后,地图仍会随着图钉拖动而平移,我通过在Grid_ManipuationStarted上禁用平移来纠正此问题。
问题似乎与Grid_ManipulationDelta函数有关,因为这是从MapControl子级中删除Grid的原因。

我已将有关此问题的视频上传到YouTube。在这里找到:https://youtu.be/uUkB5Pi5MnA

我的代码如下:

    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拖动Image,然后放下销钉,使用MapControl.SetLocation(Not TranslateX / Y)将网格移动到销钉放置的位置,然后将销钉Image的TranslateX / Y转换为0,0(相对于父网格)。
这适用于Grid仅使用SetLocation移动的情况,后者似乎工作正常,并且不会像以前那样将其与地图断开连接。销相对于网格移动,没有像以前那样的问题。启动时移至0,0并与地图对象断开连接。

干杯!

如果有人感兴趣,可以发布代码,但我认为这很容易解释。

关于c# - 在UWP上创建可拖动的 map 图钉,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42480276/

10-12 12:57