ProSnippets MapExploration - Esri/arcgis-pro-sdk GitHub Wiki

Language:              C#  
Subject:               MapExploration  
Contributor:           ArcGIS Pro SDK Team <[email protected]>  
Organization:          esri, http://www.esri.com  
Date:                  10/22/2024  
ArcGIS Pro:            3.4  
Visual Studio:         2022  
.NET Target Framework: .Net 8  

MapView

Test if the view is 3D

public bool IsView3D()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return false;

  //Return whether the viewing mode is SceneLocal or SceneGlobal
  return mapView.ViewingMode == ArcGIS.Core.CIM.MapViewingMode.SceneLocal ||
         mapView.ViewingMode == ArcGIS.Core.CIM.MapViewingMode.SceneGlobal;
}

Set ViewingMode

public void SetViewingModeToSceneLocal()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return;

  //Check if the view can be set to SceneLocal and if it can set it.
  if (mapView.CanSetViewingMode(ArcGIS.Core.CIM.MapViewingMode.SceneLocal))
    mapView.SetViewingModeAsync(ArcGIS.Core.CIM.MapViewingMode.SceneLocal);
}

Enable View Linking

public void EnableViewLinking()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return;

  //Set the view linking mode to Center and Scale.
  MapView.LinkMode = LinkMode.Center | LinkMode.Scale;
}

Update MapView Extent (Zoom, Pan etc)

Go To Previous Camera

public Task<bool> ZoomToPreviousCameraAsync()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  //Zoom to the selected layers in the TOC
  if (mapView.HasPreviousCamera())
    return mapView.PreviousCameraAsync();

  return Task.FromResult(false);
}

Go To Next Camera

public Task<bool> ZoomToNextCameraAsync()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  //Zoom to the selected layers in the TOC
  if (mapView.HasNextCamera())
    return mapView.NextCameraAsync();

  return Task.FromResult(false);
}

Zoom To Full Extent

public Task<bool> ZoomToFullExtent()
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return false;

    //Zoom to the map's full extent
    return mapView.ZoomToFullExtent();
  });
}

public Task<bool> ZoomToFullExtentAsync()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  //Zoom to the map's full extent
  return mapView.ZoomToFullExtentAsync(TimeSpan.FromSeconds(2));
}

Fixed Zoom In

public Task<bool> ZoomInFixed()
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return false;

    //Zoom in the map view by a fixed amount.
    return mapView.ZoomInFixed();
  });
}

public Task<bool> ZoomInFixedAsync()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  //Zoom in the map view by a fixed amount.
  return mapView.ZoomInFixedAsync();
}

Fixed Zoom Out

public Task<bool> ZoomOutFixed()
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return false;

    //Zoom out in the map view by a fixed amount.
    return mapView.ZoomOutFixed();
  });
}

public Task<bool> ZoomOutFixedAsync()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  //Zoom in the map view by a fixed amount.
  return mapView.ZoomOutFixedAsync();
}

Zoom To an Extent

public Task<bool> ZoomToExtent(double xMin, double yMin, double xMax, double yMax, ArcGIS.Core.Geometry.SpatialReference spatialReference)
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  //Create the envelope
  var envelope = ArcGIS.Core.Geometry.EnvelopeBuilderEx.CreateEnvelope(xMin, yMin, xMax, yMax, spatialReference);

  //Zoom the view to a given extent.
  return mapView.ZoomToAsync(envelope, TimeSpan.FromSeconds(2));
}

Zoom To a Point

public Task<bool> ZoomToPoint(double x, double y, ArcGIS.Core.Geometry.SpatialReference spatialReference)
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  return QueuedTask.Run(() =>
  {
    //Note: Run within QueuedTask
    //Create a point
    var pt = MapPointBuilderEx.CreateMapPoint(x, y, spatialReference);
    //Buffer it - for purpose of zoom
    var poly = GeometryEngine.Instance.Buffer(pt, buffer_size);

    //do we need to project the buffer polygon?
    if (!MapView.Active.Map.SpatialReference.IsEqual(poly.SpatialReference))
    {
      //project the polygon
      poly = GeometryEngine.Instance.Project(poly, MapView.Active.Map.SpatialReference);
    }

    //Zoom - add in a delay for animation effect
    return mapView.ZoomTo(poly, new TimeSpan(0, 0, 0, 3));
  });
}

Zoom To Selected Features

public Task<bool> ZoomToSelected()
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return false;

    //Zoom to the map's selected features.
    return mapView.ZoomToSelected();
  });
}

public Task<bool> ZoomToSelectedAsync()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  //Zoom to the map's selected features.
  return mapView.ZoomToSelectedAsync(TimeSpan.FromSeconds(2));
}

Zoom To Bookmark by name

public Task<bool> ZoomToBookmark(string bookmarkName)
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return false;

    //Get the first bookmark with the given name.
    var bookmark = mapView.Map.GetBookmarks().FirstOrDefault(b => b.Name == bookmarkName);
    if (bookmark == null)
      return false;

    //Zoom the view to the bookmark.
    return mapView.ZoomTo(bookmark);
  });
}

public async Task<bool> ZoomToBookmarkAsync(string bookmarkName)
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return false;

  //Get the first bookmark with the given name.
  var bookmark = await QueuedTask.Run(() => mapView.Map.GetBookmarks().FirstOrDefault(b => b.Name == bookmarkName));
  if (bookmark == null)
    return false;

  //Zoom the view to the bookmark.
  return await mapView.ZoomToAsync(bookmark, TimeSpan.FromSeconds(2));
}

Zoom To Visible Layers

public Task<bool> ZoomToAllVisibleLayersAsync()
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return false;

    //Zoom to all visible layers in the map.
    var visibleLayers = mapView.Map.Layers.Where(l => l.IsVisible);
    return mapView.ZoomTo(visibleLayers);
  });
}

Zoom To Selected Layers

public Task<bool> ZoomToTOCSelectedLayersAsync()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  //Zoom to the selected layers in the TOC
  var selectedLayers = mapView.GetSelectedLayers();
  return mapView.ZoomToAsync(selectedLayers);
}

Pan To an Extent

public Task<bool> PanToExtent(double xMin, double yMin, double xMax, double yMax, ArcGIS.Core.Geometry.SpatialReference spatialReference)
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return false;

    //Pan the view to a given extent.
    var envelope = ArcGIS.Core.Geometry.EnvelopeBuilderEx.CreateEnvelope(xMin, yMin, xMax, yMax, spatialReference);
    return mapView.PanTo(envelope);
  });
}

public Task<bool> PanToExtentAsync(double xMin, double yMin, double xMax, double yMax, ArcGIS.Core.Geometry.SpatialReference spatialReference)
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  //Create the envelope
  var envelope = ArcGIS.Core.Geometry.EnvelopeBuilderEx.CreateEnvelope(xMin, yMin, xMax, yMax, spatialReference);

  //Pan the view to a given extent.
  return mapView.PanToAsync(envelope, TimeSpan.FromSeconds(2));
}

Pan To Selected Features

public Task<bool> PanToSelected()
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return false;

    //Pan to the map's selected features.
    return mapView.PanToSelected();
  });
}

public Task<bool> PanToSelectedAsync()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  //Pan to the map's selected features.
  return mapView.PanToSelectedAsync(TimeSpan.FromSeconds(2));
}

Pan To Bookmark

public Task<bool> PanToBookmark(string bookmarkName)
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return false;

    //Get the first bookmark with the given name.
    var bookmark = mapView.Map.GetBookmarks().FirstOrDefault(b => b.Name == bookmarkName);
    if (bookmark == null)
      return false;

    //Pan the view to the bookmark.
    return mapView.PanTo(bookmark);
  });
}

public async Task<bool> PanToBookmarkAsync(string bookmarkName)
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return false;

  //Get the first bookmark with the given name.
  var bookmark = await QueuedTask.Run(() => mapView.Map.GetBookmarks().FirstOrDefault(b => b.Name == bookmarkName));
  if (bookmark == null)
    return false;

  //Pan the view to the bookmark.
  return await mapView.PanToAsync(bookmark, TimeSpan.FromSeconds(2));
}

Pan To Visible Layers

public Task<bool> PanToAllVisibleLayersAsync()
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return false;

    //Pan to all visible layers in the map.
    var visibleLayers = mapView.Map.Layers.Where(l => l.IsVisible);
    return mapView.PanTo(visibleLayers);
  });
}

Pan To Selected Layers Asynchronous

public Task<bool> PanToTOCSelectedLayersAsync()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  //Pan to the selected layers in the TOC
  var selectedLayers = mapView.GetSelectedLayers();
  return mapView.PanToAsync(selectedLayers);
}

Rotate the map view

public Task<bool> RotateView(double heading)
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return Task.FromResult(false);

  //Get the camera for the view, adjust the heading and zoom to the new camera position.
  var camera = mapView.Camera;
  camera.Heading = heading;
  return mapView.ZoomToAsync(camera, TimeSpan.Zero);
}

// or use the synchronous method
public Task<bool> RotateViewAsync(double heading)
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return false;

    //Get the camera for the view, adjust the heading and zoom to the new camera position.
    var camera = mapView.Camera;
    camera.Heading = heading;
    return mapView.ZoomTo(camera, TimeSpan.Zero);
  });
}

Expand Extent

public Task<bool> ExpandExtentAsync(double dx, double dy)
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return false;

    //Expand the current extent by the given ratio.
    var extent = mapView.Extent;
    var newExtent = ArcGIS.Core.Geometry.GeometryEngine.Instance.Expand(extent, dx, dy, true);
    return mapView.ZoomTo(newExtent);
  });
}

Maps

Get the active map's name

public string GetActiveMapName()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return null;

  //Return the name of the map currently displayed in the active map view.
  return mapView.Map.Name;
}

Clear all selection in an Active map

QueuedTask.Run(() =>
{
  if (MapView.Active.Map != null)
  {
    MapView.Active.Map.SetSelection(null);
  }
});

Calculate Selection tolerance in map units

//Selection tolerance for the map in pixels
var selectionTolerance = SelectionEnvironment.SelectionTolerance;
QueuedTask.Run(() =>
{
  //Get the map center
  var mapExtent = MapView.Active.Map.GetDefaultExtent();
  var mapPoint = mapExtent.Center;
  //Map center as screen point
  var screenPoint = MapView.Active.MapToScreen(mapPoint);
  //Add selection tolerance pixels to get a "radius".
  var radiusScreenPoint = new System.Windows.Point((screenPoint.X + selectionTolerance), screenPoint.Y);
  var radiusMapPoint = MapView.Active.ScreenToMap(radiusScreenPoint);
  //Calculate the selection tolerance distance in map uints.
  var searchRadius = GeometryEngine.Instance.Distance(mapPoint, radiusMapPoint);
});

MapView Overlay Control

//Creat a Progress Bar user control
var progressBarControl = new System.Windows.Controls.ProgressBar();
//Configure the progress bar
progressBarControl.Minimum = 0;
progressBarControl.Maximum = 100;
progressBarControl.IsIndeterminate = true;
progressBarControl.Width = 300;
progressBarControl.Value = 10;
progressBarControl.Height = 25;
progressBarControl.Visibility = System.Windows.Visibility.Visible;
//Create a MapViewOverlayControl. 
var mapViewOverlayControl = new MapViewOverlayControl(progressBarControl, true, true, true, OverlayControlRelativePosition.BottomCenter, .5, .8);
//Add to the active map
MapView.Active.AddOverlayControl(mapViewOverlayControl);
await QueuedTask.Run(() =>
{
  //Wait 3 seconds to remove the progress bar from the map.
  Thread.Sleep(3000);

});
//Remove from active map
MapView.Active.RemoveOverlayControl(mapViewOverlayControl);

Layers

Select all feature layers in TOC

public void SelectAllFeatureLayersInTOC()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return;

  //Zoom to the selected layers in the TOC
  var featureLayers = mapView.Map.Layers.OfType<FeatureLayer>();
  mapView.SelectLayers(featureLayers.ToList());
}

Flash selected features

public Task FlashSelectedFeaturesAsync()
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return;

    //Get the selected features from the map and filter out the standalone table selection.

    //At 2.x
    //var selectedFeatures = mapView.Map.GetSelection()
    //    .Where(kvp => kvp.Key is BasicFeatureLayer)
    //    .ToDictionary(kvp => (BasicFeatureLayer)kvp.Key, kvp => kvp.Value);

    ////Flash the collection of features.
    //mapView.FlashFeature(selectedFeatures);

    var selectedFeatures = mapView.Map.GetSelection();

    //Flash the collection of features.
    mapView.FlashFeature(selectedFeatures);
  });
}

Check if Layer is visible in the given map view

var mapView = MapView.Active;
var layer = mapView.Map.GetLayersAsFlattenedList().OfType<Layer>().FirstOrDefault();
if (mapView == null) return;
bool isLayerVisibleInView = layer.IsVisibleInView(mapView);
if (isLayerVisibleInView)
{
  //Do Something
}

Select a layer and open its layer properties page

// get the layer you want
var layer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();

// select it in the TOC
List<Layer> layersToSelect = new List<Layer>();
layersToSelect.Add(layer);
MapView.Active.SelectLayers(layersToSelect);

// now execute the layer properties command
var wrapper = FrameworkApplication.GetPlugInWrapper("esri_mapping_selectedLayerPropertiesButton");
var command = wrapper as ICommand;
if (command == null)
  return;

// execute the command
if (command.CanExecute(null))
  command.Execute(null);

Clear selection for a specific layer

var lyr = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
QueuedTask.Run(() =>
{
  lyr.ClearSelection();
});

Display Table pane for Map Member

var mapMember = MapView.Active.Map.GetLayersAsFlattenedList().OfType<MapMember>().FirstOrDefault();
//Gets or creates the CIMMapTableView for a MapMember.
var tableView = FrameworkApplication.Panes.GetMapTableView(mapMember);
//Configure the table view
tableView.DisplaySubtypeDomainDescriptions = false;
tableView.SelectionMode = false;
tableView.ShowOnlyContingentValueFields = true;
tableView.HighlightInvalidContingentValueFields = true;
//Open the table pane using the configured tableView. If a table pane is already open it will be activated.
//You must be on the UI thread to call this function.
var tablePane = FrameworkApplication.Panes.OpenTablePane(tableView);

TableView

Set Table ViewingMode

//Get the active table view.
var tableView = TableView.Active;
if (tableView == null)
  return;

// change to "selected record" mode
tableView.SetViewMode(TableViewMode.eSelectedRecords);

Set ZoomLevel

//Get the active table view.
var tableView = TableView.Active;
if (tableView == null)
  return;

// change zoom level
if (tableView.ZoomLevel > 100)
  tableView.SetZoomLevel(100);
else
  tableView.SetZoomLevel(200);

Toggle Field Alias

//Get the active table view.
var tableView = TableView.Active;
if (tableView == null)
  return;


// set the value
tableView.ShowFieldAlias = true;

// OR toggle it
if (tableView.CanToggleFieldAlias)
  tableView.ToggleFieldAlias();

Toggle Subtype Descriptions

//Get the active table view.
var tableView = TableView.Active;
if (tableView == null)
  return;


// set the value
tableView.ShowSubtypeDomainDescriptions = true;

// OR toggle it
if (tableView.CanToggleSubtypeDomainDescriptions)
  tableView.ToggleSubtypeDomainDescriptionsAsync();

Get the active row

//Get the active table view.
var tableView = TableView.Active;
if (tableView == null)
  return;

// get the active rowindex
int rowIndex = tableView.ActiveRowIndex;

Change the active row

//Get the active table view.
var tableView = TableView.Active;
if (tableView == null)
  return;

// get the active rowindex
int rowIndex = tableView.ActiveRowIndex;

// move to a different row
var newIndex = 10 + rowIndex;
await tableView.BringIntoView(newIndex);

Get the active object ID

//Get the active table view.
var tableView = TableView.Active;
if (tableView == null)
  return;

// get the active objectID
long? OID = tableView.ActiveObjectId;

Translate between rowIndex and objectID

//Get the active table view.
var tableView = TableView.Active;
if (tableView == null)
  return;

// get the active rowindex
int rowIndex = tableView.ActiveRowIndex;
// increase
int newIndex = rowIndex + 10;
// get the objectID
long newOID = await tableView.GetObjectIdAsync(newIndex);

// get the rowIndex for a specific objectID
//   2nd parameter indicates if the search only occurs for the pages loaded
//   if pass false, then in the worst case, a full table scan will occur to 
//    find the objectID.
long OID = 100;
var idx = await tableView.GetRowIndexAsync(OID, true);

Get selected rows or row indexes

var tv = TableView.Active;
if (tv == null)
  return;

QueuedTask.Run(async () =>
{
  // get the set of selected objectIDs 
  var selOids = tv.GetSelectedObjectIds();
  // get the set of selected row indexes
  var selRows = tv.GetSelectedRowIndexes();

});

Change selected rows

var tv = TableView.Active;
if (tv == null)
  return;

QueuedTask.Run(async () =>
{
  // set of selected OIDS
  var newoids = new List<long>();
  newoids.AddRange(new List<long>() { 10, 15, 17 });
  tv.Select(newoids, true);


  // add to set of selected row indexes
  var selRows = tv.GetSelectedRowIndexes();
  var newRows = new List<long>(selRows);
  newRows.AddRange(new List<long>() { 21, 35 });
  tv.Select(newRows, false);
});

Select all rows

var tv = TableView.Active;
if (tv == null)
  return;

if (tv.CanSelectAll)
  tv.SelectAll();

Toggle, Switch, Clear Selection

var tv = TableView.Active;
if (tv == null)
  return;

// toggle the active rows selection
if (tv.CanToggleRowSelection)
  tv.ToggleRowSelection();

// switch the selection
if (tv.CanSwitchSelection)
  tv.SwitchSelection();

// clear the selection
if (tv.CanClearSelection)
  tv.ClearSelection();

Zoom or Pan To Selected Rows

var tv = TableView.Active;
if (tv == null)
  return;

if (tv.CanZoomToSelected)
  tv.ZoomToSelected();

if (tv.CanPanToSelected)
  tv.PanToSelected();

Delete Selected Rows

var tv = TableView.Active;
if (tv == null)
  return;

if (tv.CanDeleteSelected)
  tv.DeleteSelected(); 

Get highlighted row indexes

var tv = TableView.Active;
if (tv == null)
  return;

QueuedTask.Run(async () =>
{
  IReadOnlyList<long> highlightedOIDs = null;
  if (tv.CanGetHighlightedObjectIds)
    // get the set of selected objectIDs 
    highlightedOIDs = tv.GetHighlightedObjectIds();
});

Change highlighted rows

var tv = TableView.Active;
if (tv == null)
  return;

QueuedTask.Run(() =>
{
  // get list of current selected objectIDs
  var selectedObjectIds = tv.GetSelectedObjectIds();
  var idsToHighlight = new List<long>();

  // add the first two selected objectIds to highlight
  if (selectedObjectIds.Count >= 2)
  {
    idsToHighlight.Add(selectedObjectIds[0]);
    idsToHighlight.Add(selectedObjectIds[1]);
  }

  // highlight
  if (tv.CanHighlight)
    tv.Highlight(idsToHighlight, true);
});

Toggle, Switch, Clear Highlights

var tv = TableView.Active;
if (tv == null)
  return;

// toggle the active rows selection
if (tv.CanToggleRowHighlight)
  tv.ToggleRowHighlight();

// switch highlighted rows
if (tv.CanSwitchHighlight)
  tv.SwitchHighlight();

// clear the highlights
if (tv.CanClearHighlighted)
  tv.ClearHighlighted();

Zoom or Pan To Highlighted Rows

var tv = TableView.Active;
if (tv == null)
  return;

if (tv.CanZoomToHighlighted)
  tv.ZoomToHighlighted();

if (tv.CanPanToHighlighted)
  tv.PanToHighlighted();

Delete Highlighted Rows

var tv = TableView.Active;
if (tv == null)
  return;

if (tv.CanDeleteHighlighted)
  tv.DeleteHighlighted();

Field Access

var tv = TableView.Active;
if (tv == null)
  return;

// field access
var flds = tv.GetFields();
var fldIdx = tv.GetFieldIndex("STATE_NAME");
var fldDesc = tv.GetField(fldIdx);

Get or set the Active Field

var tv = TableView.Active;
if (tv == null)
  return;

// get active field, active field name
var activeFieldIdx = tv.ActiveFieldIndex;
var fldDesc = tv.GetField(activeFieldIdx);
var fldName = fldDesc.Name;

// set active field by name
tv.SetActiveField("STATE_NAME");

// or set active field by index
tv.SetActiveField(3);

Select Fields

var tv = TableView.Active;
if (tv == null)
  return;

// get selected fields
var selectedfields = tv.GetSelectedFields();

// set selected fields
tv.SetSelectedFields(new List<string> { "CITY_FIPS", "STATE_FIPS" });

Set Field Order

var tv = TableView.Active;
if (tv == null)
  return;

if (tv.CanResetFieldOrder)
{
  tv.ResetFieldOrder();

  var fldOrder = new List<string>();
  fldOrder.Add("STATE_NAME");
  fldOrder.Add("STATE_FIPS");
  await tv.SetFieldOrderAsync(fldOrder);
}

Show or Hide Fields

var tv = TableView.Active;
if (tv == null)
  return;

// get list of hidden fields
var hiddenFields = tv.GetHiddenFields();


// show all fields
if (tv.CanShowAllFields)
  tv.ShowAllFields();



// hide only "CITY_FIPS", "STATE_FIPS"
if (tv.CanShowAllFields)
{
  // show all fields
  tv.ShowAllFields();
  tv.SetHiddenFields(new List<string> { "CITY_FIPS", "STATE_FIPS" });
}



// add "STATE_NAME to set of hidden fields
tv.SetHiddenFields(new List<string> { "STATE_NAME" });


// hide selected fields
if (tv.CanHideSelectedFields)
  tv.HideSelectedFields();

Freeze Fields

var tv = TableView.Active;
if (tv == null)
  return;

// get list of frozen fields
var frozenfields = tv.GetFrozenFields();

// un freeze all fields
await tv.ClearAllFrozenFieldsAsync();


// freeze a set of fields
await tv.SetFrozenFieldsAsync(new List<string> { "CITY_FIPS", "STATE_FIPS" });

Sort

var tv = TableView.Active;
if (tv == null)
  return;

// sort the active field descending
if (tv.CanSortDescending)
  tv.SortDescending();


// sort the active field ascending
if (tv.CanSortAscending)
  tv.SortAscending();


// peform a custom sort programmatically
if (tv.CanCustomSort)
{
  // sort fields
  var dict = new Dictionary<string, FieldSortInfo>();
  dict.Add("STATE_NAME", FieldSortInfo.Asc);
  dict.Add("CITY_NAME", FieldSortInfo.Desc);
  await tv.SortAsync(dict);
}


// perform a custom sort via the UI
if (tv.CanCustomSort)
  tv.CustomSort();

Find and Replace

var tv = TableView.Active;
if (tv == null)
  return;

// launch the find UI
if (tv.CanFind)
  tv.Find();


// or launch the find and replace UI
if (tv.CanFindAndReplace)
  tv.FindAndReplace();

GoTo

var tv = TableView.Active;
if (tv == null)
  return;

// launch the GoTo UI
if (tv.CanGoTo)
  tv.GoTo();

Refresh

var tv = TableView.Active;
if (tv == null)
  return;

// refresh
if (tv.CanRefresh)
  tv.Refresh();

Change table View caption

// find all the table panes (table panes hosting map data)
var tablePanes = FrameworkApplication.Panes.OfType<ITablePane>();
var tablePane = tablePanes.FirstOrDefault(p => (p as ITablePaneEx)?.Caption == "oldcCaption");
var tablePaneEx = tablePane as ITablePaneEx;
if (tablePaneEx != null)
  tablePaneEx.Caption = "newCaption";

// find all the external table panes (table panes hosting external data)
var externalPanes = FrameworkApplication.Panes.OfType<IExternalTablePane>();
var externalTablePane = externalPanes.FirstOrDefault(p => p.Caption == "oldcCaption");
if (externalTablePane != null)
  externalTablePane.Caption = "newCaption";

Get TableView from table pane

TableView tv = null;

// find all the table panes (table panes hosting map data)
var tablePanes = FrameworkApplication.Panes.OfType<ITablePane>();
var tablePane = tablePanes.FirstOrDefault(p => (p as ITablePaneEx)?.Caption == "caption");
var tablePaneEx = tablePane as ITablePaneEx;
if (tablePaneEx != null)
  tv = tablePaneEx.TableView;

// if it's not found, maybe it's an external table pane
if (tv == null)
{
  // find all the external table panes (table panes hosting external data)
  var externalPanes = FrameworkApplication.Panes.OfType<IExternalTablePane>();
  var externalTablePane = externalPanes.FirstOrDefault(p => p.Caption == "caption");
  if (externalTablePane != null)
    tv = externalTablePane.TableView;
}

Features

Mask feature

//Get the layer to be masked
var lineLyrToBeMasked = MapView.Active.Map.Layers.FirstOrDefault(lyr => lyr.Name == "TestLine") as FeatureLayer;
//Get the layer's definition
var lyrDefn = lineLyrToBeMasked.GetDefinition();
//Create an array of Masking layers (polygon only)
//Set the LayerMasks property of the Masked layer
lyrDefn.LayerMasks = new string[] { "CIMPATH=map3/testpoly.xml" };
//Re-set the Masked layer's defintion
lineLyrToBeMasked.SetDefinition(lyrDefn);

Popups

Show a pop-up for a feature

public void ShowPopup(MapMember mapMember, long objectID)
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return;

  mapView.ShowPopup(mapMember, objectID);
}

Show a custom pop-up

public void ShowCustomPopup()
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return;

  //Create custom popup content
  var popups = new List<PopupContent>
        {
            new PopupContent("<b>This text is bold.</b>", "Custom tooltip from HTML string"),
            new PopupContent(new Uri("http://www.esri.com/"), "Custom tooltip from Uri")
        };
  mapView.ShowCustomPopup(popups);
}

Show a pop-up for a feature using pop-up window properties

public void ShowPopupWithWindowDef(MapMember mapMember, long objectID)
{
  if (MapView.Active == null) return;
  // Sample code: https://github.com/Esri/arcgis-pro-sdk-community-samples/blob/master/Map-Exploration/CustomIdentify/CustomIdentify.cs
  var topLeftCornerPoint = new System.Windows.Point(200, 200);
  var popupDef = new PopupDefinition()
  {
    Append = true,      // if true new record is appended to existing (if any)
    Dockable = true,    // if true popup is dockable - if false Append is not applicable
    Position = topLeftCornerPoint,  // Position of top left corner of the popup (in pixels)
    Size = new System.Windows.Size(200, 400)    // size of the popup (in pixels)
  };
  MapView.Active.ShowPopup(mapMember, objectID, popupDef);
}

Show a custom pop-up using pop-up window properties

public void ShowCustomPopupWithWindowDef()
{
  if (MapView.Active == null) return;

  //Create custom popup content
  var popups = new List<PopupContent>
        {
            new PopupContent("<b>This text is bold.</b>", "Custom tooltip from HTML string"),
            new PopupContent(new Uri("http://www.esri.com/"), "Custom tooltip from Uri")
        };
  // Sample code: https://github.com/Esri/arcgis-pro-sdk-community-samples/blob/master/Framework/DynamicMenu/DynamicFeatureSelectionMenu.cs
  var topLeftCornerPoint = new System.Windows.Point(200, 200);
  var popupDef = new PopupDefinition()
  {
    Append = true,      // if true new record is appended to existing (if any)
    Dockable = true,    // if true popup is dockable - if false Append is not applicable
    Position = topLeftCornerPoint,  // Position of top left corner of the popup (in pixels)
    Size = new System.Windows.Size(200, 400)    // size of the popup (in pixels)
  };
  MapView.Active.ShowCustomPopup(popups, null, true, popupDef);
}

Show A pop-up With Custom Commands

public void ShowCustomPopup(MapMember mapMember, long objectID)
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return;

  //Create custom popup content from existing map member and object id
  var popups = new List<PopupContent>();
  popups.Add(new PopupContent(mapMember, objectID));

  //Create a new custom command to add to the popup window
  var commands = new List<PopupCommand>();
  commands.Add(new PopupCommand(
    p => MessageBox.Show(string.Format("Map Member: {0}, ID: {1}", p.MapMember, p.IDString)),
    p => { return p != null; },
    "My custom command",
    System.Windows.Application.Current.Resources["GenericCheckMark16"] as ImageSource));

  mapView.ShowCustomPopup(popups, commands, true);
}

Show A Dynamic Pop-up

public void ShowDynamicPopup(MapMember mapMember, List<long> objectIDs)
{
  //Get the active map view.
  var mapView = MapView.Active;
  if (mapView == null)
    return;

  //Create popup whose content is created the first time the item is requested.
  var popups = new List<PopupContent>();
  foreach (var id in objectIDs)
  {
    popups.Add(new DynamicPopupContent(mapMember, id));
  }

  mapView.ShowCustomPopup(popups);
}

internal class DynamicPopupContent : PopupContent
{
  public DynamicPopupContent(MapMember mapMember, long objectID)
  {
    MapMember = mapMember;
    IDString = objectID.ToString();
    IsDynamicContent = true;
  }

  //Called when the pop-up is loaded in the window.
  protected override Task<string> OnCreateHtmlContent()
  {
    return QueuedTask.Run(() => string.Format("<b>Map Member: {0}, ID: {1}</b>", MapMember, IDString));
  }
}

Bookmarks

Create a new bookmark using the active map view

public Task<Bookmark> AddBookmarkAsync(string name)
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return null;

    //Adding a new bookmark using the active view.
    return mapView.Map.AddBookmark(mapView, name);
  });
}

Add New Bookmark from CIMBookmark

public Task<Bookmark> AddBookmarkFromCameraAsync(Camera camera, string name)
{
  return QueuedTask.Run(() =>
  {
    //Set properties for Camera
    CIMViewCamera cimCamera = new CIMViewCamera()
    {
      X = camera.X,
      Y = camera.Y,
      Z = camera.Z,
      Scale = camera.Scale,
      Pitch = camera.Pitch,
      Heading = camera.Heading,
      Roll = camera.Roll
    };

    //Create new CIM bookmark and populate its properties
    var cimBookmark = new CIMBookmark() { Camera = cimCamera, Name = name, ThumbnailImagePath = "" };

    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return null;

    //Add a new bookmark for the active map.
    return mapView.Map.AddBookmark(cimBookmark);
  });
}

Get the collection of bookmarks for the project

public Task<ReadOnlyObservableCollection<Bookmark>> GetProjectBookmarksAsync()
{
  //Get the collection of bookmarks for the project.
  return QueuedTask.Run(() => Project.Current.GetBookmarks());
}

Get Map Bookmarks

public Task<ReadOnlyObservableCollection<Bookmark>> GetActiveMapBookmarksAsync()
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return null;

    //Return the collection of bookmarks for the map.
    return mapView.Map.GetBookmarks();
  });
}

Move Bookmark to the Top

public Task MoveBookmarkToTopAsync(Map map, string name)
{
  return QueuedTask.Run(() =>
  {
    //Find the first bookmark with the name
    var bookmark = map.GetBookmarks().FirstOrDefault(b => b.Name == name);
    if (bookmark == null)
      return;

    //Remove the bookmark
    map.MoveBookmark(bookmark, 0);
  });
}

Rename Bookmark

public Task RenameBookmarkAsync(Bookmark bookmark, string newName)
{
  return QueuedTask.Run(() => bookmark.Rename(newName));
}

Remove bookmark with a given name

public Task RemoveBookmarkAsync(Map map, string name)
{
  return QueuedTask.Run(() =>
  {
    //Find the first bookmark with the name
    var bookmark = map.GetBookmarks().FirstOrDefault(b => b.Name == name);
    if (bookmark == null)
      return;

    //Remove the bookmark
    map.RemoveBookmark(bookmark);
  });
}

Change the thumbnail for a bookmark

public Task SetThumbnailAsync(Bookmark bookmark, string imagePath)
{
  //Set the thumbnail to an image on disk, ie. C:\Pictures\MyPicture.png.
  BitmapImage image = new BitmapImage(new Uri(imagePath, UriKind.RelativeOrAbsolute));
  return QueuedTask.Run(() => bookmark.SetThumbnail(image));
}

Update Bookmark

public Task UpdateBookmarkAsync(Bookmark bookmark)
{
  return QueuedTask.Run(() =>
  {
    //Get the active map view.
    var mapView = MapView.Active;
    if (mapView == null)
      return;

    //Update the bookmark using the active map view.
    bookmark.Update(mapView);
  });
}

Update Extent for a Bookmark

public Task UpdateBookmarkExtentAsync(Bookmark bookmark, ArcGIS.Core.Geometry.Envelope envelope)
{
  return QueuedTask.Run(() =>
  {
    //Get the bookmark's definition
    var bookmarkDef = bookmark.GetDefinition();

    //Modify the bookmark's location
    bookmarkDef.Location = envelope;

    //Clear the camera as it is no longer valid.
    bookmarkDef.Camera = null;

    //Set the bookmark definition
    bookmark.SetDefinition(bookmarkDef);
  });
}

Time

Step forward in time by 1 month

public void StepMapTime()
{
  //Get the active view
  MapView mapView = MapView.Active;
  if (mapView == null)
    return;

  //Step current map time forward by 1 month
  TimeDelta timeDelta = new TimeDelta(1, TimeUnit.Months);
  mapView.Time = mapView.Time.Offset(timeDelta);
}

Disable time in the map.

MapView.Active.Time.Start = null;
MapView.Active.Time.End = null;

Animations

Set Animation Length

public void SetAnimationLength(TimeSpan length)
{
  var mapView = MapView.Active;
  if (mapView != null)
    return;

  var animation = mapView.Map.Animation;
  var duration = animation.Duration;
  if (duration == TimeSpan.Zero)
    return;

  var factor = length.TotalSeconds / duration.TotalSeconds;
  animation.ScaleDuration(factor);
}

Scale Animation

public void ScaleAnimationAfterTime(TimeSpan afterTime, TimeSpan length)
{
  var mapView = MapView.Active;
  if (mapView != null)
    return;

  var animation = mapView.Map.Animation;
  var duration = animation.Duration;
  if (duration == TimeSpan.Zero || duration <= afterTime)
    return;

  var factor = length.TotalSeconds / (duration.TotalSeconds - afterTime.TotalSeconds);
  animation.ScaleDuration(afterTime, duration, factor);
}

Camera Keyframes

public List<CameraKeyframe> GetCameraKeyframes()
{
  var mapView = MapView.Active;
  if (mapView != null)
    return null;

  var animation = mapView.Map.Animation;
  var cameraTrack = animation.Tracks.OfType<CameraTrack>().First(); //There will always be only 1 CameraTrack in the animation.
  return cameraTrack.Keyframes.OfType<CameraKeyframe>().ToList();
}

Interpolate Camera

public Task<List<Camera>> GetInterpolatedCameras()
{
  //Return the collection representing the camera for each frame in animation.
  return QueuedTask.Run(() =>
  {
    var mapView = MapView.Active;
    if (mapView != null || mapView.Animation == null)
      return null;

    var animation = mapView.Map.Animation;

    var cameras = new List<Camera>();
    //We will use ticks here rather than milliseconds to get the highest precision possible.
    var ticksPerFrame = Convert.ToInt64(animation.Duration.Ticks / (animation.NumberOfFrames - 1));
    for (int i = 0; i < animation.NumberOfFrames; i++)
    {
      var time = TimeSpan.FromTicks(i * ticksPerFrame);
      //Because of rounding for ticks the last calculated time may be greating than the duration.
      if (time > animation.Duration)
        time = animation.Duration;
      cameras.Add(mapView.Animation.GetCameraAtTime(time));
    }
    return cameras;
  });
}

Interpolate Time

public Task<List<TimeRange>> GetInterpolatedMapTimes()
{
  //Return the collection representing the map time for each frame in animation.
  return QueuedTask.Run(() =>
  {
    var mapView = MapView.Active;
    if (mapView != null || mapView.Animation == null)
      return null;

    var animation = mapView.Map.Animation;

    var timeRanges = new List<TimeRange>();
    //We will use ticks here rather than milliseconds to get the highest precision possible.
    var ticksPerFrame = Convert.ToInt64(animation.Duration.Ticks / (animation.NumberOfFrames - 1));
    for (int i = 0; i < animation.NumberOfFrames; i++)
    {
      var time = TimeSpan.FromTicks(i * ticksPerFrame);
      //Because of rounding for ticks the last calculated time may be greating than the duration.
      if (time > animation.Duration)
        time = animation.Duration;
      timeRanges.Add(mapView.Animation.GetCurrentTimeAtTime(time));
    }
    return timeRanges;
  });
}

Interpolate Range

public Task<List<ArcGIS.Desktop.Mapping.Range>> GetInterpolatedMapRanges()
{
  //Return the collection representing the map time for each frame in animation.
  return QueuedTask.Run(() =>
  {
    var mapView = MapView.Active;
    if (mapView != null || mapView.Animation == null)
      return null;

    var animation = mapView.Map.Animation;

    var ranges = new List<ArcGIS.Desktop.Mapping.Range>();
    //We will use ticks here rather than milliseconds to get the highest precision possible.
    var ticksPerFrame = Convert.ToInt64(animation.Duration.Ticks / (animation.NumberOfFrames - 1));
    for (int i = 0; i < animation.NumberOfFrames; i++)
    {
      var time = TimeSpan.FromTicks(i * ticksPerFrame);
      //Because of rounding for ticks the last calculated time may be greeting than the duration.
      if (time > animation.Duration)
        time = animation.Duration;
      ranges.Add(mapView.Animation.GetCurrentRangeAtTime(time));
    }
    return ranges;
  });
}

Create Camera Keyframe

public void CreateCameraKeyframe(TimeSpan atTime)
{
  var mapView = MapView.Active;
  if (mapView != null)
    return;

  var animation = mapView.Map.Animation;
  var cameraTrack = animation.Tracks.OfType<CameraTrack>().First(); //There will always be only 1 CameraTrack in the animation.
  cameraTrack.CreateKeyframe(mapView.Camera, atTime, ArcGIS.Core.CIM.AnimationTransition.FixedArc);
}

Create Time Keyframe

public void CreateTimeKeyframe(TimeSpan atTime)
{
  var mapView = MapView.Active;
  if (mapView != null)
    return;

  var animation = mapView.Map.Animation;
  var timeTrack = animation.Tracks.OfType<TimeTrack>().First(); //There will always be only 1 TimeTrack in the animation.
  timeTrack.CreateKeyframe(mapView.Time, atTime, ArcGIS.Core.CIM.AnimationTransition.Linear);
}

Create Range Keyframe

public void CreateRangeKeyframe(ArcGIS.Desktop.Mapping.Range range, TimeSpan atTime)
{
  var mapView = MapView.Active;
  if (mapView != null)
    return;

  var animation = mapView.Map.Animation;
  var rangeTrack = animation.Tracks.OfType<RangeTrack>().First(); //There will always be only 1 RangeTrack in the animation.
  rangeTrack.CreateKeyframe(range, atTime, ArcGIS.Core.CIM.AnimationTransition.Linear);
}

Create Layer Keyframe

public void CreateLayerKeyframe(Layer layer, double transparency, TimeSpan atTime)
{
  var mapView = MapView.Active;
  if (mapView != null)
    return;

  var animation = mapView.Map.Animation;
  var layerTrack = animation.Tracks.OfType<LayerTrack>().First(); //There will always be only 1 LayerTrack in the animation.
  layerTrack.CreateKeyframe(layer, atTime, true, transparency, ArcGIS.Core.CIM.AnimationTransition.Linear);
}

Graphic overlay

Graphic Overlay

//Defined elsewhere
private IDisposable _graphic = null;
public async void GraphicOverlaySnippetTest()
{
  // get the current mapview and point
  var mapView = MapView.Active;
  if (mapView == null)
    return;
  var myextent = mapView.Extent;
  var point = myextent.Center;

  // add point graphic to the overlay at the center of the mapView
  _graphic = await QueuedTask.Run(() =>
  {
    //add these to the overlay
    return mapView.AddOverlay(point,
        SymbolFactory.Instance.ConstructPointSymbol(
                ColorFactory.Instance.RedRGB, 30.0, SimpleMarkerStyle.Star).MakeSymbolReference());
  });

  // update the overlay with new point graphic symbol
  MessageBox.Show("Now to update the overlay...");
  await QueuedTask.Run(() =>
  {
    mapView.UpdateOverlay(_graphic, point, SymbolFactory.Instance.ConstructPointSymbol(
                                  ColorFactory.Instance.BlueRGB, 20.0, SimpleMarkerStyle.Circle).MakeSymbolReference());
  });

  // clear the overlay display by disposing of the graphic
  MessageBox.Show("Now to clear the overlay...");
  _graphic.Dispose();

}

Graphic Overlay with CIMPictureGraphic

// get the current mapview
var mapView = MapView.Active;
if (mapView == null)
  return;

//Valid formats for PictureURL are:
// e.g. local file URL:
// file:///<path>
// file:///c:/images/symbol.png
//
// e.g. network file URL:
// file://<host>/<path>
// file://server/share/symbol.png
//
// e.g. data URL:
// data:<mediatype>;base64,<data>
// data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAU ...
//
// image/bmp
// image/gif
// image/jpeg
// image/png
// image/tiff
// image/x-esri-bglf

var pictureGraphic = new CIMPictureGraphic
{
  PictureURL = @"file:///C:/Images/MyImage.png",
  Shape = envelope
};

IDisposable _graphic = mapView.AddOverlay(pictureGraphic);

Add overlay graphic with text

internal class AddOverlayWithText : MapTool
{
  private IDisposable _graphic = null;
  private CIMLineSymbol _lineSymbol = null;
  public AddOverlayWithText()
  {
    IsSketchTool = true;
    SketchType = SketchGeometryType.Line;
    SketchOutputMode = SketchOutputMode.Map;
  }

  protected override async Task<bool> OnSketchCompleteAsync(Geometry geometry)
  {
    //Add an overlay graphic to the map view
    _graphic = await this.AddOverlayAsync(geometry, _lineSymbol.MakeSymbolReference());

    //define the text symbol
    var textSymbol = new CIMTextSymbol();
    //define the text graphic
    var textGraphic = new CIMTextGraphic();

    await QueuedTask.Run(() =>
    {
      //Create a simple text symbol
      textSymbol = SymbolFactory.Instance.ConstructTextSymbol(ColorFactory.Instance.BlackRGB, 8.5, "Corbel", "Regular");
      //Sets the geometry of the text graphic
      textGraphic.Shape = geometry;
      //Sets the text string to use in the text graphic
      textGraphic.Text = "This is my line";
      //Sets symbol to use to draw the text graphic
      textGraphic.Symbol = textSymbol.MakeSymbolReference();
      //Draw the overlay text graphic
      _graphic = this.ActiveMapView.AddOverlay(textGraphic);
    });

    return true;
  }
}

Tools

Change symbol for a sketch tool

internal class SketchTool_WithSymbol : MapTool
{
  public SketchTool_WithSymbol()
  {
    IsSketchTool = true;
    SketchOutputMode = SketchOutputMode.Map; //Changing the Sketch Symbol is only supported with map sketches.
    SketchType = SketchGeometryType.Rectangle;
  }

  protected override Task OnToolActivateAsync(bool hasMapViewChanged)
  {
    return QueuedTask.Run(() =>
    {
      //Set the Sketch Symbol if it hasn't already been set.
      if (SketchSymbol != null)
        return;
      var polygonSymbol = SymbolFactory.Instance.ConstructPolygonSymbol(ColorFactory.Instance.CreateRGBColor(24, 69, 59),
                          SimpleFillStyle.Solid,
                        SymbolFactory.Instance.ConstructStroke(ColorFactory.Instance.BlackRGB, 1.0, SimpleLineStyle.Dash));
      SketchSymbol = polygonSymbol.MakeSymbolReference();
    });
  }
}

Create a tool to the return coordinates of the point clicked in the map

internal class GetMapCoordinates : MapTool
{
  protected override void OnToolMouseDown(MapViewMouseButtonEventArgs e)
  {
    if (e.ChangedButton == System.Windows.Input.MouseButton.Left)
      e.Handled = true; //Handle the event args to get the call to the corresponding async method
  }

  protected override Task HandleMouseDownAsync(MapViewMouseButtonEventArgs e)
  {
    return QueuedTask.Run(() =>
    {
      //Convert the clicked point in client coordinates to the corresponding map coordinates.
      var mapPoint = MapView.Active.ClientToMap(e.ClientPoint);
      ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show(string.Format("X: {0} Y: {1} Z: {2}",
                  mapPoint.X, mapPoint.Y, mapPoint.Z), "Map Coordinates");
    });
  }
}

Create a tool to identify the features that intersect the sketch geometry

internal class CustomIdentify : MapTool
{
  public CustomIdentify()
  {
    IsSketchTool = true;
    SketchType = SketchGeometryType.Rectangle;

    //To perform a interactive selection or identify in 3D or 2D, sketch must be created in screen coordinates.
    SketchOutputMode = SketchOutputMode.Screen;
  }

  protected override Task<bool> OnSketchCompleteAsync(Geometry geometry)
  {
    return QueuedTask.Run(() =>
    {
      var mapView = MapView.Active;
      if (mapView == null)
        return true;

      //Get all the features that intersect the sketch geometry and flash them in the view. 
      var results = mapView.GetFeatures(geometry);
      mapView.FlashFeature(results);

      var debug = String.Join("\n", results.ToDictionary()
                    .Select(kvp => String.Format("{0}: {1}", kvp.Key.Name, kvp.Value.Count())));
      System.Diagnostics.Debug.WriteLine(debug);
      return true;
    });
  }
}

Change the cursor of a Tool

internal class CustomMapTool : MapTool
{
  public CustomMapTool()
  {
    IsSketchTool = true;
    SketchType = SketchGeometryType.Rectangle;
    SketchOutputMode = SketchOutputMode.Map;
    //A custom cursor file as an embedded resource
    var cursorEmbeddedResource = new Cursor(new MemoryStream(Resource1.red_cursor));
    //A built in system cursor
    var systemCursor = System.Windows.Input.Cursors.ArrowCD;
    //Set the "CustomMapTool's" Cursor property to either one of the cursors defined above
    Cursor = cursorEmbeddedResource;
    //or
    Cursor = systemCursor;
  }

Tool with an Embeddable Control

// Using the Visual Studio SDK templates, add a MapTool and an EmbeddableControl
// The EmbeddableControl is registered in the "esri_embeddableControls" category in the config.daml file
// 
//  <categories>
//    <updateCategory refID = "esri_embeddableControls" >
//      <insertComponent id="mapTool_EmbeddableControl" className="EmbeddableControl1ViewModel">
//        <content className = "EmbeddableControl1View" />
//      </insertComponent>
//    <updateCategory>
//  </categories>
internal class MapTool_WithControl : MapTool
{
  public MapTool_WithControl()
  {
    // substitute this string with the daml ID of the embeddable control you added
    ControlID = "mapTool_EmbeddableControl";
  }

  protected override void OnToolMouseDown(MapViewMouseButtonEventArgs e)
  {
    e.Handled = true;
  }

  protected override Task HandleMouseDownAsync(MapViewMouseButtonEventArgs e)
  {
    //Get the instance of the ViewModel
    var vm = EmbeddableControl;
    if (vm == null)
      return Task.FromResult(0);

    // cast vm to your viewModel in order to access your properties

    //Get the map coordinates from the click point and set the property on the ViewMode.
    return QueuedTask.Run(() =>
    {
      var mapPoint = MapView.Active.ClientToMap(e.ClientPoint);
      string clickText = string.Format("X: {0}, Y: {1}, Z: {2}", mapPoint.X, mapPoint.Y, mapPoint.Z);
    });
  }
}

Tool with an Overlay Embeddable Control

// Using the Visual Studio SDK templates, add a MapTool and an EmbeddableControl
// The EmbeddableControl is registered in the "esri_embeddableControls" category in the config.daml file
// 
//  <categories>
//    <updateCategory refID = "esri_embeddableControls" >
//      <insertComponent id="mapTool_EmbeddableControl" className="EmbeddableControl1ViewModel">
//        <content className = "EmbeddableControl1View" />
//      </insertComponent>
//    <updateCategory>
//  </categories>

internal class MapTool_WithOverlayControl : MapTool
{
  public MapTool_WithOverlayControl()
  {
    // substitute this string with the daml ID of the embeddable control you added
    OverlayControlID = "mapTool_EmbeddableControl";
  }

  protected override void OnToolMouseDown(MapViewMouseButtonEventArgs e)
  {
    e.Handled = true;
  }

  protected override Task HandleMouseDownAsync(MapViewMouseButtonEventArgs e)
  {
    //Get the instance of the ViewModel
    var vm = OverlayEmbeddableControl;
    if (vm == null)
      return Task.FromResult(0);

    // cast vm to your viewModel in order to access your properties

    //Get the map coordinates from the click point and set the property on the ViewMode.
    return QueuedTask.Run(() =>
    {
      var mapPoint = MapView.Active.ClientToMap(e.ClientPoint);
      string clickText = string.Format("X: {0}, Y: {1}, Z: {2}", mapPoint.X, mapPoint.Y, mapPoint.Z);
    });
  }
}

Mapping Options

Get/Set Selection Options

var options = ApplicationOptions.SelectionOptions;

QueuedTask.Run(() =>
{
  var defaultColor = options.DefaultSelectionColor;

  var color = options.SelectionColor as CIMRGBColor;
  options.SetSelectionColor(ColorFactory.Instance.CreateRGBColor(255, 0, 0));


  var defaultFill = options.DefaultSelectionFillColor;
  var fill = options.SelectionFillColor;
  var isHatched = options.IsSelectionFillHatched;
  options.SetSelectionFillColor(ColorFactory.Instance.CreateRGBColor(100, 100, 0));
  if (!isHatched)
    options.SetSelectionFillIsHatched(true);

  var showSelectionChip = options.ShowSelectionChip;
  options.SetShowSelectionChip(!showSelectionChip);

  var showSelectionGraphic = options.ShowSelectionGraphic;
  options.SetShowSelectionGraphic(!showSelectionGraphic);

  var saveSelection = options.SaveSelection;
  options.SetSaveSelection(!saveSelection);

  var defaultTol = options.DefaultSelectionTolerance;
  var tol = options.SelectionTolerance;
  options.SetSelectionTolerance(2 * defaultTol);

  // extension methods available 
  var selMethod = options.SelectionMethod;
  options.SetSelectionMethod(SelectionMethod.Contains);

  var combMethod = options.CombinationMethod;
  options.SetCombinationMethod(SelectionCombinationMethod.Add);

  // note that the following SelectionCombinationMethod is not supported
  //options.SetCombinationMethod(SelectionCombinationMethod.XOR);
});

Get/Set Table Options

var options = ApplicationOptions.TableOptions;

var hideAddNewRow = options.HideAddNewRow;
options.HideAddNewRow = !hideAddNewRow;

var overrides = options.HonorSelectionColorOverrides;
options.HonorSelectionColorOverrides = !overrides;

var activateMapView = options.ActivateMapViewAfterOperations;
options.ActivateMapViewAfterOperations = !activateMapView;

var defaultFontTName = options.DefaultFontName;
var fontName = options.FontName;
if (options.IsValidFontName("Arial"))
  options.FontName = "Arial";

var defaultFontSize = options.DefaultFontSize;
var fontSize = options.FontSize;
if (options.IsValidFontSize(10))
  options.FontSize = 10;

var heightType = options.ColumnHeaderHeightType;
options.ColumnHeaderHeightType = TableRowHeightType.Double;

var rowHeightType = options.RowHeightType;
options.RowHeightType = TableRowHeightType.Single;

var defaultColor = options.DefaultHighlightColor;
var color = options.HighlightColor;
QueuedTask.Run(() =>
{
  options.SetHighlightColor(ColorFactory.Instance.CreateRGBColor(0, 0, 255));
});
⚠️ **GitHub.com Fallback** ⚠️