Xamarin Forms Maps - 如何获取 Zoom 的值并在其上添加监听器?

Xamarin Forms Maps - How to get the value of the Zoom and add a listener on it?

我认为一切都在标题中,我正在使用 PCL 逻辑

提前致谢!

然后我找到了解决方案!

你有这样的地图,它继承自 Xamarin 地图控件:

public class CustomMap : Map
{
    // Your others properties

    public static readonly BindableProperty ZoomLevelProperty =
        BindableProperty.Create(nameof(ZoomLevel), typeof(Distance), typeof(CustomMap), new Distance());
    public Distance ZoomLevel
    {
        get { return (Distance)GetValue(ZoomLevelProperty); }
        set { SetValue(ZoomLevelProperty, value); }
    }

    #region Constructor
    public CustomMap()
    {
        this.PropertyChanged += (object sender, PropertyChangedEventArgs e) =>
        {
            CustomMap map = sender as CustomMap;
            if (map.VisibleRegion != null)
            {
                this.ZoomLevel = map.VisibleRegion.Radius;
                Debug.WriteLine("Xamarin Forms Map Radius: {0} Kilometers | {1} Meters | {2} Miles.", ZoomLevel.Kilometers, ZoomLevel.Meters, ZoomLevel.Miles);
            }
        };
    }
    #endregion
}

让我解释一下:

因此,一旦您定义了 CustomMap,就必须像我一样添加缩放 属性。此 属性 必须是 Distance 类型。现在,如何设置呢?在构造函数中,例如,你可以像我一样做。对于地图上的每个手势,您的缩放 属性 将被设置,然后您可以使用 公里、米和英里

注:不过构造函数中好像没有设置ZoomLevel,好像至少需要一个手势,不过我正在工作在上面,稍后我会编辑我的答案!

如果您需要在每次设置缩放时在渲染器中编辑某些内容,您可以执行如下操作:(UWP 示例,但其他人也一样 Android/iOS )

[assembly: ExportRenderer(typeof(CustomMap), typeof(CustomMapRenderer))]
namespace Project.UWP.CustomRenderer
{
    public class CustomMapRenderer : MapRenderer
    {
        MapControl nativeMap;
        CustomMap customMap;

        protected override void OnElementChanged(ElementChangedEventArgs<Map> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                customMap = (CustomMap)e.NewElement;
                nativeMap = Control as MapControl;
            }
        }

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

            if (this.Element == null || this.Control == null)
                return;

            //From here, each time the zoom is set you going into the if()
            if (e.PropertyName == CustomMap.ZoomLevelProperty.PropertyName)
                ZoomSetted();
        }

        private void ZoomSetted()
        {
            if (customMap != null && nativeMap != null)
            {
                Debug.WriteLine("Hello World ! You can access the zoom like that =>"); 
                Debug.WriteLine("Xamarin Forms Map Radius: {0} Kilometers | {1} Meters | {2} Miles.", 
                    customMap.ZoomLevel.Kilometers, 
                    customMap.ZoomLevel.Meters, 
                    customMap.ZoomLevel.Miles);
            }
        }
    }
}