Xamarin.Forms.Maps 2.3.4自定义MapRenderer禁用所有内容

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).

有帮助吗?

谢谢

Isa*_*eda 4

我已经找到了解决方案。

查看源代码,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