繁体   English   中英

Xamarin Forms-来自Android的.cs文件的参考XAML

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM