【问题标题】:Latest version of Xmarin.Forms.Maps breaks custom renderer最新版本的 Xamarin.Forms.Maps 刹车自定义渲染器
【发布时间】:2017-06-05 09:01:43
【问题描述】:

尝试使用自定义渲染器在地图上显示一个圆圈。 (安卓)

将 Xamarin.Forms.Maps 更新到 v2.3.3.175,现在出现错误:CustomMapRenderer.OnElementChanged(ElementChangedEventArgs)':找不到合适的方法来覆盖。

以前工作过没有问题。甚至下面链接中的示例也不再有效。 https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/maps/map-overlay/circle/

ElementChangedEventArgs<View> 更改为ElementChangedEventArgs<Map> 可解决错误,但渲染器永远不会被调用,因此圆圈永远不会显示。

有什么想法吗?提前致谢。

我的自定义 Android 渲染器:

using Android.Gms.Maps;
using Android.Gms.Maps.Model;
using Xamarin.Forms;
using Xamarin.Forms.Maps.Android;
using GasFinder;
using MapOverlay.Droid;

[assembly: ExportRenderer(typeof(CustomMap),typeof(CustomMapRenderer))]
namespace MapOverlay.Droid {
    public class CustomMapRenderer:MapRenderer, IOnMapReadyCallback {
    GoogleMap map;
    CustomCircle circle;

    protected override void OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs<View> e) {
        base.OnElementChanged(e);

        if(e.OldElement != null) {
            // Unsubscribe
        }

        if(e.NewElement != null) {
            var formsMap = (CustomMap)e.NewElement;
            circle = formsMap.Circle;
            ((MapView)Control).GetMapAsync(this);
        }
    }
    public void OnMapReady(GoogleMap googleMap) {
        map = googleMap;

        var circleOptions = new CircleOptions();
        circleOptions.InvokeCenter(new LatLng(circle.Position.Latitude,circle.Position.Longitude));
        circleOptions.InvokeRadius(circle.Radius);
        circleOptions.InvokeFillColor(0X233273b1);
        circleOptions.InvokeStrokeColor(0X64007eff);
        circleOptions.InvokeStrokeWidth(10);
        map.AddCircle(circleOptions);
    }
}
}

CustomMap.cs如下:

using System.Collections.Generic;
using Xamarin.Forms.Maps;

namespace GasFinder {
    public class CustomMap:Map {
        public CustomCircle Circle { get; set; }
    }
}

CustomCircle.cs如下:

using Xamarin.Forms.Maps;

namespace GasFinder {
    public class CustomCircle {
        public Position Position { get; set; }
        public double Radius { get; set; }
    }
}

我的 Page.xaml.cs 上的代码如下:

var position = new Xamarin.Forms.Maps.Position(Search.loc.lat,Search.loc.lng);
customMap.Circle = new CustomCircle {
    Position = position,
    Radius = Settings.Distance*1000
};

【问题讨论】:

  • 方法签名应该是protected override void OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs&lt;Xamarin.Forms.Maps.Map&gt; e)(如果你将它们添加到你的使用列表中,你可以省略一些命名空间)。你确定它被称为?你有没有在那个被命中的地方设置断点?
  • 这就是我所拥有的,但那行不起作用。
  • 如果您输入 override 并让 IntelliSense 建议您?它想出了什么?
  • 嗨@RussellCorbin 你最终解决了这个问题吗?目前面临同样的问题
  • 是的,我做到了。我会尽快发布代码。

标签: xamarin xamarin.forms


【解决方案1】:

使用 Xamarin.Forms.Maps v2.3.3.193

protected override void OnElementChanged(ElementChangedEventArgs<Map> e) {
    base.OnElementChanged(e); 
    if(e.OldElement != null) { } 
    if(e.NewElement != null) { 
        var formsMap = (CustomMap)e.NewElement; 
        circle = formsMap.Circle; 
        ((MapView)Control).GetMapAsync(this); 
    } 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-06
    • 2018-04-19
    • 2012-08-22
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    相关资源
    最近更新 更多