2017-07-18 28 views
0

MapPage.xamlという名前のコードと、MapPage.xaml.csというコードがあります。私のアンドロイドプロジェクトでは、CustomMapRenderer.csという別のファイルがあります。 CustomMapRenderer.csファイルでは、MapPage.xamlファイルにあるXAMLピッカーで選択した項目を取得する必要があります。これは、ユーザーがXAMLピッカーでオプションを選択したときに変更されます。Xamarinフォーム - Android固有の.csファイルのXAML

ピッカーを私のCustomMapRenderer.csからどのように参照するのですか? CustomMapRenderer.csファイルで

+0

ピッカーにカスタムレンダラーを使用する必要があります。 –

+0

なぜそれが@BrunoCaceiro –

答えて

1

、私は、ユーザーが私のXAMLピッカーでオプションを選ぶときに変化する私のMapPage.xamlファイルで検出されたXAMLピッカー、中項目選択された変数を取得する必要があります。

あなたCustomMapRendererを作成するには、公式ドキュメントCustomizing a Mapに従った場合は、その後、PCLでは、例えば、Mapから継承するクラスがあるはずです。そして、

public class CustomMap : Map 
{ 

} 

、あなたのピッカーが別のコントロールの場合MainPageではCustomMapのバインド可能なプロパティを作成し、レンダラーでOnElementPropertyChangedをオーバーライドして、変更時にこのプロパティを取得することができます。

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

とそのレンダラーに:例えば、PCLで

map.MyZoom = MapWithMyZoomControl.ZoomState.zoomin; 
:このマップ制御のうち

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

は、私は地図をズームするように制御するためにボタンを使用します

デモですが、これを変更してプロパティをピッカーに接続することができます。

+0

この深い答えのおかげでグレース、私はそれを今行っている –

関連する問題