Customizing GPS averaging and streaming

Complexity: Beginner Data Requirement: Installed with software

The GPS averaging and GPS streaming geometry collection methods allow a greater level of customization because a developer can add custom commands (as buttons) directly within the GPS averaging/streaming pages. The GpsAveragingPage and GpsStreamingPage both have a CustomActions property, which is a collection of commands that is shown on the page as a button:

public  ObservableCollection<IUICommand>  CustomActions { get; }

Adding a custom command to either of these pages can be done as follows:

Steps:
  1. Listen to the CollectFeaturesTask.GeometryCollectionStarted event.
  2. In the GeometryCollectionStarted event handler, see whether the GeometryCollectionStartedEventArgs.CollectionMethod parameter is either the GpsAveragingGeometryCollectionMethod or GpsStreamingGeometryCollectionMethod.
  3. From GpsAveragingGeometryCollectionMethod or GpsStreamingGeometryCollectionMethod in step 2, obtain a reference to GpsAveragingPage or GpsStreamingPage, respectively, using the GeometryCollectionPage property.
  4. From the page in step 3, add your command to the page's CustomActions collection.

Example extension

The following is an example of an extension that adds a custom command to both the GPS averaging and GPS streaming pages:

public class  GpsCustomizationExtension : ProjectExtension
{
  private CollectFeaturesTask _collectFeaturesTask;
  private GpsAveragingGeometryCollectionMethod _averagingCollectionMethod;
  private GpsStreamingGeometryCollectionMethod _streamingCollectionMethod;

  protected override void Initialize() {}

  protected override void OnOwnerInitialized()
  {
    _collectFeaturesTask = MobileApplication.Current.FindTask(typeof(CollectFeaturesTask)) as CollectFeaturesTask;
    if (_collectFeaturesTask != null)
    {
      _collectFeaturesTask.GeometryCollectionStarted += new EventHandler<GeometryCollectionStartedEventArgs>(task_GeometryCollectionStarted);
      _collectFeaturesTask.GeometryCollectionCompleted += new EventHandler<GeometryCollectionCompletedEventArgs>(_collectFeaturesTask_GeometryCollectionCompleted);
    }
  }

  protected override void Uninitialize()
  {
    if (_collectFeaturesTask != null)
    {
      _collectFeaturesTask.GeometryCollectionStarted -= new EventHandler<GeometryCollectionStartedEventArgs>(task_GeometryCollectionStarted);
      _collectFeaturesTask.GeometryCollectionCompleted -= new EventHandler<GeometryCollectionCompletedEventArgs>(_collectFeaturesTask_GeometryCollectionCompleted);
      _collectFeaturesTask = null;
    }
  }

  void task_GeometryCollectionStarted(object sender, GeometryCollectionStartedEventArgs e)
  {
    if (e.CollectionMethod is GpsAveragingGeometryCollectionMethod)
    {
      UICommand command = new UICommand("Custom Averaging", param => this.CustomAveragingCommandExecute());
      _averagingCollectionMethod = e.CollectionMethod as GpsAveragingGeometryCollectionMethod;
      _averagingCollectionMethod.GeometryCollectionPage.CustomActions.Add(command);
    }
    else if (e.CollectionMethod is GpsStreamingGeometryCollectionMethod)
    {
      UICommand command = new UICommand("Custom Streaming", param => this.CustomStreamingCommandExecute());
      _streamingCollectionMethod = e.CollectionMethod as GpsStreamingGeometryCollectionMethod;
      _streamingCollectionMethod.GeometryCollectionPage.CustomActions.Add(command);
    }
  }

  void _collectFeaturesTask_GeometryCollectionCompleted(object sender, GeometryCollectionCompletedEventArgs e)
  {
    _averagingCollectionMethod = null;
    _streamingCollectionMethod = null;
  }

  private void CustomAveragingCommandExecute()
  {
    System.Text.StringBuilder builder = new System.Text.StringBuilder();
    builder.AppendLine("You clicked my custom GPS averaging action");
    builder.AppendLine(String.Format("Current Coordinate Index = {0}", _averagingCollectionMethod.Geometry.CurrentCoordinateIndex));    
    ESRI.ArcGIS.Mobile.Client.Windows.MessageBox.ShowDialog(builder.ToString());
  }

  private void CustomStreamingCommandExecute()
  {
    System.Text.StringBuilder builder = new System.Text.StringBuilder();
    builder.AppendLine("You clicked my custom GPS streaming action");
    builder.AppendLine(String.Format("Current Coordinate Index = {0}", _streamingCollectionMethod.Geometry.CurrentCoordinateIndex));    
    ESRI.ArcGIS.Mobile.Client.Windows.MessageBox.ShowDialog(builder.ToString());
  }
}


9/20/2011