diff options
author | Ethan Dennis <erdennis13@gmail.com> | 2017-03-20 10:40:04 -0500 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2017-03-20 08:40:04 -0700 |
commit | 5ca7259959022253c6a71c5290854929291caec5 (patch) | |
tree | aae699f20b2f4b20e9418114504f825513002c60 /Xamarin.Forms.Maps.UWP/MapRenderer.cs | |
parent | f98e1525c15ca77ec9840c2b5c8020b1b320b141 (diff) | |
download | xamarin-forms-5ca7259959022253c6a71c5290854929291caec5.tar.gz xamarin-forms-5ca7259959022253c6a71c5290854929291caec5.tar.bz2 xamarin-forms-5ca7259959022253c6a71c5290854929291caec5.zip |
UWP MapRenderer NRE and Location fixes (#811)
* Issues:
1. If UWP MapRenderer is navigated away from, before the user location
is found, an uncaught NRE will be thrown.
2. UWP MapRenderer updates are not enforced to be on UI thread
3. Order of operations in MapRenderer would cause user location to never
be shown.
Fixes:
1. Added null checks in UpdateUserIsShowing and LoadUserPosition
methods.
2. Called map position updates on UI thread.
3. Changed order of operations in OnElementChanged to allow for user
geocoordinates to be shown.
* Fixed code formatting issues
* Fix formatting
* Deterministic null checks
* Updated null checks
Diffstat (limited to 'Xamarin.Forms.Maps.UWP/MapRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Maps.UWP/MapRenderer.cs | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/Xamarin.Forms.Maps.UWP/MapRenderer.cs b/Xamarin.Forms.Maps.UWP/MapRenderer.cs index 7b3bcd2c..abecbe37 100644 --- a/Xamarin.Forms.Maps.UWP/MapRenderer.cs +++ b/Xamarin.Forms.Maps.UWP/MapRenderer.cs @@ -47,8 +47,8 @@ namespace Xamarin.Forms.Maps.WinRT { SetNativeControl(new MapControl()); Control.MapServiceToken = FormsMaps.AuthenticationToken; - Control.ZoomLevelChanged += (s, a) => UpdateVisibleRegion(); - Control.CenterChanged += (s, a) => UpdateVisibleRegion(); + Control.ZoomLevelChanged += async (s, a) => await UpdateVisibleRegion(); + Control.CenterChanged += async (s, a) => await UpdateVisibleRegion(); } MessagingCenter.Subscribe<Map, MapSpan>(this, "MapMoveToRegion", async (s, a) => await MoveToRegion(a), mapModel); @@ -62,9 +62,11 @@ namespace Xamarin.Forms.Maps.WinRT if (mapModel.Pins.Any()) LoadPins(); - await UpdateIsShowingUser(); + if (Control == null) return; + await Control.Dispatcher.RunIdleAsync(async (i) => await MoveToRegion(mapModel.LastMoveToRegion, MapAnimationKind.None)); - } + await UpdateIsShowingUser(); + } } protected override async void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) @@ -162,7 +164,8 @@ namespace Xamarin.Forms.Maps.WinRT async Task UpdateIsShowingUser(bool moveToLocation = true) { - + if (Control == null || Element == null) return; + if (Element.IsShowingUser) { var myGeolocator = new Geolocator(); @@ -174,6 +177,8 @@ namespace Xamarin.Forms.Maps.WinRT LoadUserPosition(userPosition.Coordinate, moveToLocation); } + if (Control == null || Element == null) return; + if (_timer == null) { _timer = new DispatcherTimer(); @@ -186,7 +191,7 @@ namespace Xamarin.Forms.Maps.WinRT } else if (_userPositionCircle != null && Control.Children.Contains(_userPositionCircle)) { - _timer?.Stop(); + _timer.Stop(); Control.Children.Remove(_userPositionCircle); } } @@ -207,7 +212,7 @@ namespace Xamarin.Forms.Maps.WinRT await Control.TrySetViewBoundsAsync(boundingBox, null, animation); } - void UpdateVisibleRegion() + async Task UpdateVisibleRegion() { if (Control == null || Element == null) return; @@ -224,7 +229,10 @@ namespace Xamarin.Forms.Maps.WinRT var center = new Position(boundingBox.Center.Latitude, boundingBox.Center.Longitude); var latitudeDelta = Math.Abs(nw.Position.Latitude - se.Position.Latitude); var longitudeDelta = Math.Abs(nw.Position.Longitude - se.Position.Longitude); - Element.VisibleRegion = new MapSpan(center, latitudeDelta, longitudeDelta); + await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => + { + Element.VisibleRegion = new MapSpan(center, latitudeDelta, longitudeDelta); + }); } } catch (Exception) @@ -235,6 +243,8 @@ namespace Xamarin.Forms.Maps.WinRT void LoadUserPosition(Geocoordinate userCoordinate, bool center) { + if (Control == null || Element == null) return; + var userPosition = new BasicGeoposition { Latitude = userCoordinate.Point.Position.Latitude, @@ -309,4 +319,4 @@ namespace Xamarin.Forms.Maps.WinRT } #endif } -}
\ No newline at end of file +} |