![](/img/trans.png)
[英]Xamarin.Forms Previewer - An android application project must reference a project containing this xaml file in order to render in the previewer
[英]Xamarin Forms - Reference XAML from Android specific .cs file
我有一个名为页面MapPage.xaml
叫后面的代码MapPage.xaml.cs
。 在我的android项目中,我还有一个名为CustomMapRenderer.cs
文件。 在CustomMapRenderer.cs
文件中,我需要在MapPage.xaml
文件中找到的XAML选择器中检索项目选择的变量,当用户在XAML选择器中选择一个选项时,该变量将更改。
如何从CustomMapRenderer.cs
引用选择器?
在CustomMapRenderer.cs文件中,我需要在我的MapPage.xaml文件中找到的XAML选择器中检索选定的项目变量,当用户在我的XAML选择器中选择一个选项时,该变量将更改。
如果您按照官方文档“ 定制地图”来创建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;
这是一个演示,但您可以对其进行修改以使属性连接到选择器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.