When interacting with ArcGIS Pro UI, it is possible to "activate" a MapFrame element (Right click → Activate) in the displayed Layout. Is it possible to do that with the SDK in C# ?
There is no such method in the MapFrame class or in the Layout class (with ArcGIS Pro 2.9).
Solved! Go to Solution.
This has been added to the API on LayoutView class at the next release 3.1.
In the meantime, u can use this code snippet as a basis for a workaround.
4 conditions must be true in order to activate a map frame:
1. You must be on the UI thread
2. The Layout view (containing the relevant map frame) must be the active view
3. The map frame to be activated must be the LayoutView.Active.ActiveMapFrame
4. The LayoutView.Active.ActiveMapFrame.Map must not be null (meaning it has an empty map frame)
If these conditions are met you can invoke the "esri_layouts_activateMap" command which will activate the LayoutView.Active.ActiveMapFrame.
internal class ActivateMapFrameBtn: Button {
protected override void OnClick()
{
//1. must be on the GUI - dont switch to QueuedTask
//2. Layout view must be active!
if (LayoutView.Active == null)
return;
//3. LayoutView.Active.ActiveMapFrame is the frame that will
// be activated
var map_frameName = "Map Frame";
if (LayoutView.Active.ActiveMapFrame == null ||
LayoutView.Active.ActiveMapFrame.Name != map_frameName) {
//simply select it to make it the active one
var selFrame = LayoutView.Active.Layout.GetElementsAsFlattenedList()
.OfType<MapFrame>().FirstOrDefault(mf => mf.Name == map_frameName);
if (selFrame == null)
return; //not found
LayoutView.Active.Layout.SelectElement(selFrame);
}
//4. Does the ActiveMapFrame have a valid map?
if (LayoutView.Active.ActiveMapFrame?.Map == null)
return; //invalid map frame - probably empty
//esri_layouts_activateMap - activate
//esri_layouts_deactivateMap - deactivate
//Do the activation
var plugin =
FrameworkApplication.GetPlugInWrapper("esri_layouts_activateMap")
as System.Windows.Input.ICommand;
if (plugin.CanExecute(null))
plugin.Execute(null);
}
}
This has been added to the API on LayoutView class at the next release 3.1.
In the meantime, u can use this code snippet as a basis for a workaround.
4 conditions must be true in order to activate a map frame:
1. You must be on the UI thread
2. The Layout view (containing the relevant map frame) must be the active view
3. The map frame to be activated must be the LayoutView.Active.ActiveMapFrame
4. The LayoutView.Active.ActiveMapFrame.Map must not be null (meaning it has an empty map frame)
If these conditions are met you can invoke the "esri_layouts_activateMap" command which will activate the LayoutView.Active.ActiveMapFrame.
internal class ActivateMapFrameBtn: Button {
protected override void OnClick()
{
//1. must be on the GUI - dont switch to QueuedTask
//2. Layout view must be active!
if (LayoutView.Active == null)
return;
//3. LayoutView.Active.ActiveMapFrame is the frame that will
// be activated
var map_frameName = "Map Frame";
if (LayoutView.Active.ActiveMapFrame == null ||
LayoutView.Active.ActiveMapFrame.Name != map_frameName) {
//simply select it to make it the active one
var selFrame = LayoutView.Active.Layout.GetElementsAsFlattenedList()
.OfType<MapFrame>().FirstOrDefault(mf => mf.Name == map_frameName);
if (selFrame == null)
return; //not found
LayoutView.Active.Layout.SelectElement(selFrame);
}
//4. Does the ActiveMapFrame have a valid map?
if (LayoutView.Active.ActiveMapFrame?.Map == null)
return; //invalid map frame - probably empty
//esri_layouts_activateMap - activate
//esri_layouts_deactivateMap - deactivate
//Do the activation
var plugin =
FrameworkApplication.GetPlugInWrapper("esri_layouts_activateMap")
as System.Windows.Input.ICommand;
if (plugin.CanExecute(null))
plugin.Execute(null);
}
}
That's it! Thank you so much!