2017-07-30 13 views
0

私のピンはasyncです。私はカスタムマップを使用しないとうまく動作します。しかし、私がAndroid projectでカスタムマップを使用しても、それはもう動作しません。私のcustom Pin listはnullです。私はそれが非同期のピンをロードしているし、カスタムピンのリストが初期化されていないので、それが理解できます。しかし、私はそれをどのように解決するのですか?すべてのプラットフォーム(Android、iOS、UWP)でこれを修正するのは大変な作業ですか?Xamarin.Forms Android projロードピン非同期

public CustomMap Map { get; set; } 

    public async Task InitilizePins() 
    { 
     var pins = (await new SamplePins().GetPinsAsync()).ToList(); 
     Map.CustomPins = pins; 

     foreach (var customPin in pins) 
     { 
      Map.Pins.Add(customPin.Pin); 
     } 
    } 

    public class CustomMap : Map 
    { 
     public List<CustomPin> CustomPins { get; set; } 
    } 

これはAndroidのカスタムマップです。私のカスタムピンは、私のフォームマップ変数上でnullです。

 List<CustomPin> customPins; 

    protected override void OnElementChanged(ElementChangedEventArgs<Map> e) 
    { 
     base.OnElementChanged(e); 

     if (e.OldElement != null) 
     { 
      NativeMap.InfoWindowClick -= OnInfoWindowClick; 
     } 

     if (e.NewElement != null) 
     { 
      var formsMap = (CustomMap)e.NewElement; 

      customPins = formsMap.CustomPins; 
      ((MapView)Control).GetMapAsync(this); 
     } 
    } 
+0

これを追跡するには、完全なサンプルプロジェクトが必要であることを確かめてください。しかし、あなたのレンダラーはあなたのピンを設定する前に呼び出されるのが最も一般的です。 –

答えて

2

私はピン非同期をロードし、カスタムピンリストが初期化されていないことだからだと理解することができます。しかし、私はそれをどのように解決するのですか?

問題を解決するための最速の方法は、(あなたがあなたのプロジェクトに関連するすべてのコードを変更する必要があります)ObservableCollection<CustomPin>List<CustomPin>からCustomPinsを変更することです。

は、その後、あなたのAndroidプロジェクトにObservableCollection<CustomPin>CollectionChangedイベントを登録します

protected override void OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs<Map> e) 
{ 
    base.OnElementChanged (e); 

    if (e.OldElement != null) { 
     NativeMap.InfoWindowClick -= OnInfoWindowClick; 

    } 

    if (e.NewElement != null) { 
     var formsMap = (CustomMap)e.NewElement; 
     //register the CollectionChanged event 
     formsMap.CustomPins.CollectionChanged += CustomPins_CollectionChanged; 
     customPins = formsMap.CustomPins; 
     Control.GetMapAsync(this); 
    } 
} 

private void CustomPins_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
{ 
    customPins = (ObservableCollection<CustomPin>)sender; 
    //rerender all the pins in the map 
    NativeMap.Clear(); 

    foreach (var pin in customPins) 
    { 
     var marker = new MarkerOptions(); 
     marker.SetPosition(new LatLng(pin.Pin.Position.Latitude, pin.Pin.Position.Longitude)); 
     marker.SetTitle(pin.Pin.Label); 
     marker.SetSnippet(pin.Pin.Address); 
      marker.SetIcon(BitmapDescriptorFactory.FromResource(Resource.Drawable.pin)); 

     NativeMap.AddMarker(marker); 
    } 
    isDrawn = true; 
} 

新しいピンを追加するたびに続いて、CustomPins_CollectionChangedがトリガされ、マップのピンは再レンダリングされます。

+0

実際に私のカスタムピンリストをObservableCollectionに変更しました。私のcustomPinsをプライベートフィールドとして持つのではなく、私は自分のフォームにマップしました。カスタムピンを取得する必要がある場合は、フォームフィールドから取得します。 – thatsIT

+0

ところで、私が何かを追加する必要がある場合は、CollectionChangedを修正します。 (私がクリックした私のコレクションからカスタムピンを取得する必要がありました)。 – thatsIT

関連する問題