2017-07-18 5 views
0

Ich habe eine Seite namens MapPage.xaml und einen Code hinter genannt . In meinem Android-Projekt habe ich eine andere Datei namens CustomMapRenderer.cs. In der Datei CustomMapRenderer.cs muss ich die ausgewählte Elementvariable in einem XAML-Picker in meiner Datei MapPage.xaml abrufen, die sich ändert, wenn ein Benutzer eine Option in meiner XAML-Auswahl auswählt.Xamarin Forms - Referenz XAML von Android spezifische .cs-Datei

Wie referenziere ich den Picker von meinem CustomMapRenderer.cs?

+0

Sie müssen einen benutzerdefinierten Renderer für Ihre Auswahl verwenden. –

+0

Warum ist das @BrunoCaceiro –

Antwort

1

In der CustomMapRenderer.cs Datei, ich brauche das Element ausgewählte Variable in einem XAML-Picker in meiner MapPage.xaml Datei, die sich ändert, gefunden abzurufen, wenn ein Benutzer eine Option in meiner XAML-Picker nimmt.

Wenn Sie die offizielle doc Customizing a Map gefolgt Ihre CustomMapRenderer, dann in PCL zu schaffen, sollte es eine Klasse sein, die sich von Map erbt, zum Beispiel:

public class CustomMap : Map 
{ 

} 

Wenn dann Ihre Kommissionierer eine andere Steuerung ist In Ihrer MainPage können Sie eine bindbare Eigenschaft für Ihre CustomMap erstellen und OnElementPropertyChanged in Ihrem Renderer überschreiben, um diese Eigenschaft zu erhalten, wenn sie geändert wurde.

Zum Beispiel in 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 
    } 
} 

Und in seinem Renderer:

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; 
     } 
    } 
} 

Aus dieser Karte Steuerung verwende ich Schaltflächen zur Steuerung der Karte vergrößern:

map.MyZoom = MapWithMyZoomControl.ZoomState.zoomin; 

Es ist eine Demo, aber Sie können sie ändern, damit die Eigenschaft mit Ihrem Picker verbunden wird.

+0

Danke für diese eingehende Antwort Grace, ich gehe jetzt durch –