在CustomMapRenderer.cs文件,我需要找回在我MapPage.xaml文件中找到一個XAML選擇器,當用戶拿起我的XAML選擇器的選項,它改變選定變量的項目。
如果按照官方文檔Customizing a Map創建您CustomMapRenderer
,然後在PCL,應當有一類從Map
繼承,例如:
public class CustomMap : Map
{
}
然後,如果你的選擇器是另一個控制在您的MainPage
中,您可以爲您的CustomMap
創建一個可綁定屬性,並在渲染器中覆蓋OnElementPropertyChanged
以在其更改時獲取此屬性。
例如,在PCL:
public class MapWithMyZoomControl : Map
{
public ZoomState MyZoom
{
get { return (ZoomState)GetValue(MyZoomProperty); }
set { SetValue(MyZoomProperty, value); }
}
public static readonly BindableProperty MyZoomProperty =
BindableProperty.Create(
propertyName: "MyZoom",
returnType: typeof(ZoomState),
declaringType: typeof(MapWithMyZoomControl),
defaultValue: ZoomState.normal,
propertyChanged: OnZoomPropertyChanged);
public static void OnZoomPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
}
public enum ZoomState
{
normal,
zoomin,
zoomout
}
}
,並在其渲染:
public class MapWithMyZoomControlRenderer : MapRenderer, IOnMapReadyCallback
{
private GoogleMap map;
public void OnMapReady(GoogleMap googleMap)
{
map = googleMap;
map.UiSettings.ZoomControlsEnabled = false;
}
protected override void OnElementChanged(ElementChangedEventArgs<Map> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
// Unsubscribe
}
if (e.NewElement != null)
{
var formsMap = (MapWithMyZoomControl)e.NewElement;
((MapView)Control).GetMapAsync(this);
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
var element = Element as MapWithMyZoomControl;
if (e.PropertyName == "MyZoom" && map != null)
{
if (element.MyZoom == MapWithMyZoomControl.ZoomState.zoomin)
{
map.AnimateCamera(CameraUpdateFactory.ZoomIn());
}
else if (element.MyZoom == MapWithMyZoomControl.ZoomState.zoomout)
{
map.AnimateCamera(CameraUpdateFactory.ZoomOut());
}
element.MyZoom = MapWithMyZoomControl.ZoomState.normal;
}
}
}
這個地圖的控制,我使用的按鈕來控制縮放地圖:
map.MyZoom = MapWithMyZoomControl.ZoomState.zoomin;
這是一個演示,但您可以修改它以使屬性連接到您的選取器。
您必須爲您的選取器使用自定義渲染器。 –
爲什麼呢@BrunoCaceiro –