C# Xamarin形成Android地图渲染器

C# Xamarin形成Android地图渲染器,c#,android,xamarin,xamarin.forms,C#,Android,Xamarin,Xamarin.forms,我成功地为Xamarin iOS创建了一个ViewRenderer,现在我正在尝试为Android实现一个渲染器,下面是我需要在Android中实现的映射: public class MapViewModel : Map { public static readonly BindableProperty LocationsProperty = BindableProperty.Create<MapViewModel, List<Branch>>(x

我成功地为Xamarin iOS创建了一个ViewRenderer,现在我正在尝试为Android实现一个渲染器,下面是我需要在Android中实现的映射:

public class MapViewModel : Map
    {
        public static readonly BindableProperty LocationsProperty = BindableProperty.Create<MapViewModel, List<Branch>>(x => x.Locations, new List<Branch>());
        public static readonly BindableProperty PinTappedCommandProperty = BindableProperty.Create<MapViewModel, Command>(x => x.PinTapped, null);

        public MapViewModel(List<Branch> locations)
        {
            Locations = locations;
            PinTapped = new Command(async (x) =>
                {
                    //await Navigation.PopModalAsync();
                    var info = new InformationView((Branch)x);
                    await Navigation.PushAsync(info);
                });
        }

        public List<Branch> Locations
        {
            get { return (List<Branch>)GetValue(LocationsProperty); }
            set { SetValue(LocationsProperty, value); }
        }

        public Command PinTapped 
        {
            get {return (Command) GetValue(PinTappedCommandProperty); }
            set {SetValue(PinTappedCommandProperty, value);}
        }
    }
公共类MapViewModel:Map
{
公共静态只读BindableProperty位置property=BindableProperty.Create(x=>x.Locations,new List());
公共静态只读BindableProperty PinTappedCommandProperty=BindableProperty.Create(x=>x.PinTapped,null);
公共地图视图模型(列出位置)
{
地点=地点;
PinTapped=新命令(异步(x)=>
{
//等待导航。PopModalAsync();
var info=新信息视图((分支机构)x);
等待导航。PushAsync(信息);
});
}
公开名单地点
{
获取{return(List)GetValue(LocationsProperty);}
set{SetValue(LocationsProperty,value);}
}
公共指挥系统
{
获取{return(Command)GetValue(PinTappedCommandProperty);}
set{SetValue(PinTappedCommandProperty,value);}
}
}
按照我在iOS上所做的,我在Android上做了这件事:

[assembly: ExportRenderer (typeof (MapViewModel), typeof (MapViewAndroid))]
public class MapViewAndroid : ViewRenderer<MapViewModel, global::Android.Gms.Maps.MapView>
    {
        private global::Android.Gms.Maps.MapView NativeMap {get { return Control; } }

        public MapViewAndroid ()
        {
        }
        protected override void OnElementPropertyChanged (object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged (sender, e);
        }
        protected override void OnElementChanged (ElementChangedEventArgs<MapViewModel> e)
        {
            base.OnElementChanged(e);
            var map = e.NewElement;
            var cmd = map.PinTapped;
            SetNativeControl(NativeMap);
        }
}
[程序集:ExportRenderer(typeof(MapViewModel)、typeof(MapViewAndroid))]
公共类MapViewAndroid:ViewRenderer
{
私有全局::Android.Gms.Maps.MapView NativeMap{get{return Control;}}
公共MapViewAndroid()
{
}
受保护的覆盖无效OneElementPropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
var-map=e.NewElement;
var cmd=map.PinTapped;
设置NativeControl(NativeMap);
}
}
控件为空,因此我无法正确设置NativeControl,在应用程序输出中我读到:
[art]JNI RegisterNativeMethods:尝试为kimo.CustomerApp.android.MapViewAndroid注册0个本机方法
。。。
我错过了什么才能让它发挥作用

谷歌地图可能需要一些时间来初始化。您需要等待它完全加载,然后才能使用它。还要确保您连接到IOnMapReadyCallback,以便在地图准备好使用时收到通知

private GoogleMap NativeMap { get;set;}
protected override void OnElementPropertyChanged (object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    base.OnElementPropertyChanged (sender, e);
    if (e.PropertyName.Equals ("VisibleRegion")) {
        var targetElement = (Android.Gms.Maps.MapView)Control;
        if (NativeMap == null) {
            targetElement.GetMapAsync (this);
        }
    }

}

与iOS实现相比,似乎缺少对SetNativeControl的调用。也许你可以研究一下,问题是我的控件为空,所以我无法检索MapView并用它设置NativeControl。。。我一定错过了什么。