我有一个名为MapPage.xaml
的网页和一个名为MapPage.xaml.cs
的代码。在我的android项目中,我有另一个名为CustomMapRenderer.cs
的文件。在CustomMapRenderer.cs
文件中,我需要在我的MapPage.xaml
文件中找到的XAML选择器中检索项目选定变量,当用户在我的XAML选择器中选择一个选项时,该变量将发生变化。
如何从我的CustomMapRenderer.cs
引用选择器?
答案 0 :(得分:1)
在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;
这是一个演示,但你可以修改它以使属性连接到你的选择器。