diff --git a/Xamarin.Forms.Maps.UWP/MapRenderer.cs b/Xamarin.Forms.Maps.UWP/MapRenderer.cs index f8a4c874138..842864b9d85 100644 --- a/Xamarin.Forms.Maps.UWP/MapRenderer.cs +++ b/Xamarin.Forms.Maps.UWP/MapRenderer.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Windows.Devices.Geolocation; using Windows.UI; +using Windows.UI.Xaml; using Windows.UI.Xaml.Controls.Maps; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Shapes; @@ -85,6 +86,9 @@ protected override void Dispose(bool disposing) { _disposed = true; + _timer?.Stop(); + _timer = null; + MessagingCenter.Unsubscribe(this, "MapMoveToRegion"); if (Element != null) @@ -96,6 +100,7 @@ protected override void Dispose(bool disposing) bool _disposed; bool _firstZoomLevelChangeFired; Ellipse _userPositionCircle; + DispatcherTimer _timer; void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { @@ -155,8 +160,9 @@ void LoadPin(Pin pin) Control.Children.Add(new PushPin(pin)); } - async Task UpdateIsShowingUser() + async Task UpdateIsShowingUser(bool moveToLocation = true) { + if (Element.IsShowingUser) { var myGeolocator = new Geolocator(); @@ -165,11 +171,24 @@ async Task UpdateIsShowingUser() { var userPosition = await myGeolocator.GetGeopositionAsync(); if (userPosition?.Coordinate != null) - LoadUserPosition(userPosition.Coordinate, true); + LoadUserPosition(userPosition.Coordinate, moveToLocation); + } + + if (_timer == null) + { + _timer = new DispatcherTimer(); + _timer.Tick += async (s, o) => await UpdateIsShowingUser(moveToLocation: false); + _timer.Interval = TimeSpan.FromSeconds(15); } + + if (!_timer.IsEnabled) + _timer.Start(); } else if (_userPositionCircle != null && Control.Children.Contains(_userPositionCircle)) + { + _timer?.Stop(); Control.Children.Remove(_userPositionCircle); + } } async Task MoveToRegion(MapSpan span, MapAnimationKind animation = MapAnimationKind.Bow)