Xamarin.forms - 如何在MapView上创建可拖动元素(标记)?

时间:2018-04-01 04:55:47

标签: c# android ios mobile xamarin.forms

我是Xamarin的新手,来自Android和Swift dev。我只是好奇在调查如何做到这一点时开始的好方法或方向是什么?它出现在Xamarin.Form.Map中,它只允许我使用引脚。

但是在Android Google Maps API上我有MarkerDrag监听器接口,在Swift中我可以使标记可拖动。如何为Xamarin.Forms Map视图设置Map Listener?请不要太详细,只想知道从哪里开始。

非常感谢任何帮助!

谢谢!

-T

1 个答案:

答案 0 :(得分:1)

  

但是在Android Google Maps API上我有MarkerDrag监听器接口,在Swift中我可以使标记可拖动。如何为Xamarin.Forms Map视图设置Map Listener?请不要太详细,只想知道从哪里开始。

对于Xamarin.Forms,如果您想要访问Xamarin.Forms不具备的某些原生功能,则需要Custom Renderer。也适用于地图:

  1. 在PCL中为地图创建自定义空控件:

    public class CustomMap:Map
    {}
    
  2. 在你的xaml页面中使用它:

    <StackLayout>
        <local:CustomMap WidthRequest="320" HeightRequest="200"
            x:Name="MyMap"
            IsShowingUser="true"
            MapType="Hybrid" />
    </StackLayout>
    
  3. 为它创建自定义渲染器(下面只是如何在Android中设置MarkerDrag事件的示例。):

    [assembly:ExportRenderer(typeof(MapsDemo.CustomMap),
        typeof(MarkerClusterRenderer))]
    namespace MapsDemo.Droid
    {
        public class MarkerClusterRenderer:MapRenderer,IOnMapReadyCallback
        {
            public MarkerClusterRenderer(Context c) : base(c)
            {
    
            }
    
            protected override void OnMapReady(GoogleMap map)
            {
                base.OnMapReady(map);
                var markerOptions = new Android.Gms.Maps.Model.MarkerOptions();
                markerOptions.SetTitle("Winffeeeeeeeeeee");
                markerOptions.SetPosition(new Android.Gms.Maps.Model.LatLng(37.051060, -122.014684));
                markerOptions.Draggable(true);
                map.AddMarker(markerOptions);
    
                map.MarkerDrag += Map_MarkerDrag;
            }
    
            private void Map_MarkerDrag(object sender, GoogleMap.MarkerDragEventArgs e)
            {
                //implement your marker drag event here
            }
    
            protected override void OnElementChanged(ElementChangedEventArgs<Map> e)
            {
                base.OnElementChanged(e);
    
                Control.GetMapAsync(this);
            }
    
        }
    }