There are some instance where you may not a running notification of the current potion but just want the current position (for instance you may want to initialize the position on a map but not track changes to position).
So this is a small helper class that starts up the coordinate watcher asynchronously, returns the first coordinate found and then shuts it down. One could use TryStart like so:
using (var watcher = new
GeoCoordinateWatcher(GeoPositionAccuracy.Default))
{
var location = watcher.TryStart
(false, TimeSpan.FromMilliseconds(1000));
}
but since that will block your UI thread (assuming you call it from the UI) you'd need to wrap it in some asynchronous stuff anyways.So I use this class:
public class ImmediateLocation : IDisposable
{
private GeoCoordinateWatcher _watcher;
private Action<GeoCoordinate> _action;
public ImmediateLocation(Action<GeoCoordinate> a)
{
Debug.Assert(a != null);
_action = a;
}
public void GetLocation()
{
if (_watcher == null)
{
_watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default);
_watcher.MovementThreshold = 1000;
_watcher.PositionChanged += new
EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>
(_watcher_PositionChanged);
_watcher.StatusChanged += new
EventHandler<GeoPositionStatusChangedEventArgs>
(_watcher_StatusChanged);
_watcher.Start(false);
if (_watcher.Status == GeoPositionStatus.Disabled
|| _watcher.Permission == GeoPositionPermission.Denied)
Dispose();
}
}
void _watcher_StatusChanged(object sender,
GeoPositionStatusChangedEventArgs e)
{
if (e.Status == GeoPositionStatus.Disabled
|| _watcher.Permission == GeoPositionPermission.Denied)
Dispose();
}
void _watcher_PositionChanged(object sender,
GeoPositionChangedEventArgs<GeoCoordinate> e)
{
_action(e.Position.Location);
Dispose();
}
public void Dispose()
{
if (_watcher != null)
{
_watcher.Stop();
_watcher.PositionChanged -= new
EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>
(_watcher_PositionChanged);
_watcher.StatusChanged -= new
EventHandler<GeoPositionStatusChangedEventArgs>
(_watcher_StatusChanged);
_watcher.Dispose();
}
_watcher = null;
_action = null;
}
}Then you can just do this:
void InitLocation()
{
var immediate = new ImmediateLocation(x => location = x);
immediate.GetLocation();
}
GeoCoordinate location;It acts like a one time use, fire and forget location setter that cleans itself up when done. It does have Dispose if you want to mange the lifetime more closely.CodeProject
No comments:
Post a Comment