c# - Xamarin.Forms.Maps 2.3.4 自定义 MapRenderer 禁用一切

标签 c# google-maps xamarin.forms

我将 Xamarin.Forms 和 Xamarin.Forms.Maps 更新到新版本 (2.3.4) 后出现问题。

之后我还更新了 Android 项目中的所有 google play 服务(以及许多我讨厌的库)。

主要问题是我有一个用于自定义图钉的自定义 MapRenderer,在 iOS 和 UWP 中工作正常,但在 Android 版本中,这个自定义 MapRenderer 破坏了所有 map 。似乎忽略了任何属性更改或方法调用。

例如,我有一个用于切换 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
        }
    }

在那个 if 中,我曾经填充我的自定义图钉(如上面的教程),现在我的 map 总是空的。

现在我在 IOnMapReadyCallback 中填充我的 map ,它工作正常,但我仍然有绑定(bind)问题。

如果我忽略自定义 MapRendered(删除流水线),所有绑定(bind)都会开始正常工作,但我的 map 现在有旧图钉并且所有自定义都消失了(很明显)。

在 PCL 中,我有 MyMap.MoveToRegion(...)MyMap.MapType = _currentType; 之类的东西,但这些说明仅在不使用时才有效自定义 MapRenderer。

我自定义的MapRenderer和上面的教程差不多。

自定义 map 是使用 C# 而不是 XAML 创建的,它没有任何 XAML 绑定(bind),但如果我使用 MapRenderer,则完全忽略任何属性更改或方法调用(如 MoveToRegion 或 MapType)。

有什么帮助吗?

谢谢

最佳答案

我已经找到了解决方案。

查看源代码,MapRenderer 已经实现了 IOnMapReadyCallback,如果您删除自定义 MapRendered 中的实现,一切都会重新开始(但没有自定义)。

MapRenderer 将 google map 实例保存在属性 NativeMap 中(也存在 Map 属性,即 Xamarin forms map 实例)所以我们不需要实现 IOnMapReadyCallback 了。我认为我们在使用 NativeMap 时需要小心,因为一开始它可能是 null

在我之前提到的方法中,我现在这样做:

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName.Equals("VisibleRegion") && !_isDrawn)
        {
            PopulateMap();
            OnGoogleMapReady();
        }
    }

我在 OnMapReady 中的代码现在进入了 OnGoogleMapReady():

    private void OnGoogleMapReady()
    {
        if (_mapReady) return;

        NativeMap.InfoWindowClick += OnInfoWindowClick;
        NativeMap.SetInfoWindowAdapter(this);

        _mapReady = true;
    }

我还在 OnElementChanged 中添加了这个以删除 NativeMap 中的任何注册委托(delegate)

        if (e.OldElement != null)
        {
            NativeMap.InfoWindowClick -= OnInfoWindowClick;
        }

目前存在一个Pull Request将 OnMapReady 实现为虚拟方法,因此我们可以在我们的实现中覆盖它,现在可以确定 NativeMap 何时不为空,但为此我们需要等待下一个版本。

您可以在此处阅读更多信息 -> https://forums.xamarin.com/discussion/92565/android-ionmapreadycallback-forms-2-3-4

关于c# - Xamarin.Forms.Maps 2.3.4 自定义 MapRenderer 禁用一切,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43374960/

相关文章:

c# - 双连载定制

c# - 如何更改 Short 中的位

c# - 在 Google map Controller 中关联列表负载?

mysql - 处理两个坐标之间距离的最有效方法是什么?

c# - Xamarin - 推送通知 - 触发服务器更新数据

ios - Xamarin 表单 iOS 应用相同的字体但不同的样式

c# - C# 中的简单套接字服务器在尝试向客户端写入数据时意外关闭连接

c# - GMAP 使用谷歌卫星层

google-maps - 谷歌地图上的箭头键导航,无需点击 map

c# - Xamarin Forms - 如何在 ListView 中显示/绑定(bind)列表?