Isa*_*eda 11 c# google-maps xamarin.forms
我将Xamarin.Forms和Xamarin.Forms.Maps更新到新版本(2.3.4)后出现问题.
之后我还更新了Android项目中的所有Google Play服务(以及我讨厌的很多库).
主要的问题是我有一个自定义MapRenderer用于自定义引脚,在iOS和UWP工作正常,但在Android版本中这个自定义MapRenderer破坏了所有Map.任何属性更改或方法调用似乎都会被忽略.
例如,我有一个按钮来切换地图类型(混合或街道),该操作永远不会改变它.我还注意到(根据本教程:https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/custom-renderer/map/customized-pin/)属性"VisibleRegion"从未改变,所以以下代码从不执行:
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName.Equals("VisibleRegion") && !_isDrawn)
{
// Do something with your custom map
}
}
Run Code Online (Sandbox Code Playgroud)
在里面,if我曾经填充我的自定义引脚(如上面的教程),现在我的地图总是空的.
现在我在里面填充我的地图IOnMapReadyCallback,它工作正常,但我仍然有绑定问题.
如果我忽略自定义MapRendered(删除装配线),所有绑定开始工作正常,但我的地图现在有旧引脚,所有自定义都消失了(显然).
在PCL我有类似的东西MyMap.MoveToRegion(...),MyMap.MapType = _currentType;但这些说明仅适用于不使用自定义MapRenderer的情况.
我的自定义MapRenderer与上面的教程几乎相同.
自定义Map是使用C#而不是使用XAML创建的,它没有任何XAML绑定,但如果我正在使用MapRenderer,则完全忽略任何属性更改或方法调用(如MoveToRegion或MapType).
有帮助吗?
谢谢
我已经找到了解决方案。
查看源代码,MapRenderer 已经实现了IOnMapReadyCallback,如果您删除自定义 MapRendered 中的实现,一切都会重新开始工作(但没有自定义)。
MapRenderer 将 google 地图实例保存在属性中NativeMap(也存在作为 Xamarin 表单地图实例的属性Map),因此我们不需要IOnMapReadyCallback再实现。我认为我们在使用时需要小心,NativeMap因为一开始它可能是null。
在我之前提到的方法中,我这样做:
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName.Equals("VisibleRegion") && !_isDrawn)
{
PopulateMap();
OnGoogleMapReady();
}
}
Run Code Online (Sandbox Code Playgroud)
我在 OnMapReady 中的代码现在进入了OnGoogleMapReady():
private void OnGoogleMapReady()
{
if (_mapReady) return;
NativeMap.InfoWindowClick += OnInfoWindowClick;
NativeMap.SetInfoWindowAdapter(this);
_mapReady = true;
}
Run Code Online (Sandbox Code Playgroud)
我还添加了这个来OnElementChanged删除任何已注册的代表NativeMap
if (e.OldElement != null)
{
NativeMap.InfoWindowClick -= OnInfoWindowClick;
}
Run Code Online (Sandbox Code Playgroud)
目前存在一个将 OnMapReady 实现为虚拟方法的Pull Request,因此我们可以在实现中重写它,现在可以确定 NativeMap 何时不为 null,但为此我们需要等待下一个版本。
您可以在此处阅读更多信息 -> https://forums.xamarin.com/discussion/92565/android-ionmapreadycallback-forms-2-3-4