2017-07-18 54 views
0

我有一個名爲MapPage.xaml的頁面和一個名爲MapPage.xaml.cs的代碼。在我的android項目中,我有另一個名爲CustomMapRenderer.cs的文件。在CustomMapRenderer.cs文件中,我需要在我的MapPage.xaml文件中找到的XAML選取器中檢索項目選定變量,當用戶在我的XAML選取器中選擇一個選項時該選項變化。Xamarin Forms - 來自Android特定.cs文件的參考XAML

如何從我的CustomMapRenderer.cs引用選取器?

+0

您必須爲您的選取器使用自定義渲染器。 –

+0

爲什麼呢@BrunoCaceiro –

回答

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; 

這是一個演示,但您可以修改它以使屬性連接到您的選取器。

+0

感謝這個深入的答案格雷斯,我正在經歷它現在 –