Xamarin表单 - 从Android特定.cs文件引用XAML

时间:2017-07-18 05:30:36

标签: xaml xamarin xamarin.android

我有一个名为MapPage.xaml的网页和一个名为MapPage.xaml.cs的代码。在我的android项目中,我有另一个名为CustomMapRenderer.cs的文件。在CustomMapRenderer.cs文件中,我需要在我的MapPage.xaml文件中找到的XAML选择器中检索项目选定变量,当用户在我的XAML选择器中选择一个选项时,该变量将发生变化。

如何从我的CustomMapRenderer.cs引用选择器?

1 个答案:

答案 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;

这是一个演示,但你可以修改它以使属性连接到你的选择器。