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);
}
}
}
}
我认为一切都在标题中,我正在使用 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);
}
}
}
}