Gets a specific "LayoutProjectItem"
LayoutProjectItem layoutProjItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("myLayout"));
Get all layouts in a project
//Gets all the layouts in the current project
var projectLayouts = Project.Current.GetItems<LayoutProjectItem>();
foreach (var layoutItem in projectLayouts)
{
//Do Something with the layout
}
ProjectItem: Get an Item or Find an Item
//GetItems searches project content
var map = Project.Current.GetItems<MapProjectItem>().FirstOrDefault(m => m.Name == "Map1");
var layout = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(m => m.Name == "Layout1");
var folders = Project.Current.GetItems<FolderConnectionProjectItem>();
var style = Project.Current.GetItems<StyleProjectItem>().FirstOrDefault(s => s.Name == "ArcGIS 3D");
//Find item uses a catalog path. The path can be to a file or dataset
var fcPath = @"C:\Pro\CommunitySampleData\Interacting with Maps\Interacting with Maps.gdb\Crimes";
var pdfPath = @"C:\Temp\Layout1.pdf";
var imgPath = @"C:\Temp\AddinDesktop16.png";
var fc = Project.Current.FindItem(fcPath);
var pdf = Project.Current.FindItem(pdfPath);
var img = Project.Current.FindItem(imgPath);
CIMGraphic
//This example references a graphic element on a layout and sets its Transparency property (which is not available in the managed API)
//by accessing the element's CIMGraphic.
//Added references
using ArcGIS.Core.CIM; //CIM
using ArcGIS.Desktop.Core; //Project
using ArcGIS.Desktop.Layouts; //Layout class
using ArcGIS.Desktop.Framework.Threading.Tasks; //QueuedTask
public class GraphicElementExample1
{
public static Task<bool> UpdateElementTransparencyAsync(string LayoutName, string ElementName, int TransValue)
{
//Reference a layoutitem in a project by name
LayoutProjectItem layoutItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals(LayoutName));
if (layoutItem == null)
return Task.FromResult(false);
return QueuedTask.Run<bool>(() =>
{
//Reference and load the layout associated with the layout item
Layout lyt = layoutItem.GetLayout();
//Reference a element by name
GraphicElement graElm = lyt.FindElement(ElementName) as GraphicElement;
if (graElm == null)
return false;
//Modify the Transparency property that exists only in the CIMGraphic class.
CIMGraphic CIMGra = graElm.GetGraphic() as CIMGraphic;
CIMGra.Transparency = TransValue; //e.g., TransValue = 50
graElm.SetGraphic(CIMGra);
return true;
});
}
}
LayoutProjectItem_GetLayout
//Reference the layout associated with a layout project item.
LayoutProjectItem layoutItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("Layout Name"));
Layout layout = await QueuedTask.Run(() => layoutItem.GetLayout()); //Perform on the worker thread
Layout_ShowProperties
//Open the layout properties dialog.
//Get the layout associated with a layout project item
LayoutProjectItem lytItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("Layout Name"));
Layout lyt = await QueuedTask.Run(() => lytItem.GetLayout()); //Worker thread
//Open the properties dialog
lyt.ShowProperties(); //GUI thread
LayoutAdded_ProjectItemsChangedEvent_Add
//Report the event args when a layout is added.
//At 2.x - ArcGIS.Desktop.Layouts.Events.LayoutAddedEvent.Subscribe((args) =>
//{
// System.Windows.MessageBox.Show("LayoutAddedEvent:" +
// Environment.NewLine +
// " arg Layout: " + args.Layout.Name);
//});
//Use ProjectItemsChangedEvent at 3.x
ArcGIS.Desktop.Core.Events.ProjectItemsChangedEvent.Subscribe((args) => {
//Layout added. Layout removed would be NotifyCollectionChangedAction.Remove
if (args.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add &&
args.ProjectItem is LayoutProjectItem layoutProjectItem)
{
var layout_name = layoutProjectItem.Name;
var layout = layoutProjectItem.GetLayout();
System.Diagnostics.Debug.WriteLine($"Layout Added: {layout_name}");
}
});
LayoutRemoved_ProjectItemsChangedEvent_Remove
//Report the event args when a layout is removed.
//At 2.x - ArcGIS.Desktop.Layouts.Events.LayoutRemovedEvent.Subscribe((args) =>
//{
// System.Windows.MessageBox.Show("LayoutViewEvent:" +
// Environment.NewLine +
// " arg Layout: " + args.Layout.Name);
//});
//Use ProjectItemsChangedEvent at 3.x
ArcGIS.Desktop.Core.Events.ProjectItemsChangedEvent.Subscribe((args) => {
//Layout added. Layout removed would be NotifyCollectionChangedAction.Remove
if (args.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove &&
args.ProjectItem is LayoutProjectItem layoutProjectItem)
{
var layout_name = layoutProjectItem.Name;
System.Diagnostics.Debug.WriteLine($"Layout Removed: {layout_name}");
}
});
LayoutRemoved_ProjectItemsChangedEvent_Removing
//Report the event args when a layout is about to be removed.
//At 2.x - ArcGIS.Desktop.Layouts.Events.LayoutRemovingEvent.Subscribe((args) =>
//{
// if (args.LayoutPath == "CIMPATH=layout.xml")
// {
// args.Cancel = true;
// }
// return Task.FromResult(0);
//});
//At 3.x use ProjectItemRemovingEvent
ArcGIS.Desktop.Core.Events.ProjectItemRemovingEvent.Subscribe((args) =>
{
var layoutItems = args.ProjectItems.ToList().OfType<LayoutProjectItem>() ?? new List<LayoutProjectItem>();
var layoutName = "DontDeleteThisOne";
foreach(var layoutItem in layoutItems)
{
if (layoutItem.Name == layoutName)
{
args.Cancel = true;//Cancel the remove
break;
}
}
return Task.FromResult(0);
});
Delete_Layout
//This example deletes a layout in a project after finding it by name.
//Added references
using ArcGIS.Desktop.Core;
using ArcGIS.Desktop.Layouts;
public class DeleteLayoutExample
{
public static Task<bool> DeleteLayoutAsync(string LayoutName)
{
//Reference a layoutitem in a project by name
LayoutProjectItem layoutItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals(LayoutName));
//Check for layoutItem
if (layoutItem == null)
return Task.FromResult<bool>(false);
//Delete the layout from the project
return Task.FromResult<bool>(Project.Current.RemoveItem(layoutItem));
}
}
LayoutView_FindAndCloseLayoutPanes
//Find and close all layout panes associated with a specific layout.
LayoutProjectItem findLytItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("Layout"));
Layout findLyt = await QueuedTask.Run(() => findLytItem.GetLayout()); //Perform on the worker thread
var panes = ProApp.Panes.FindLayoutPanes(findLyt);
foreach (Pane pane in panes)
{
ProApp.Panes.CloseLayoutPanes(findLyt.URI); //Close the pane
}
Reference layout project items and their associated layout
//Reference layout project items and their associated layout.
//A layout project item is an item that appears in the Layouts
//folder in the Catalog pane.
//Reference all the layout project items
IEnumerable<LayoutProjectItem> layouts =
Project.Current.GetItems<LayoutProjectItem>();
//Or reference a specific layout project item by name
LayoutProjectItem layoutItem = Project.Current.GetItems<LayoutProjectItem>()
.FirstOrDefault(item => item.Name.Equals("MyLayout"));
Open a layout project item in a new view
//Open a layout project item in a new view.
//A layout project item may exist but it may not be open in a view.
//Reference a layout project item by name
LayoutProjectItem someLytItem = Project.Current.GetItems<LayoutProjectItem>()
.FirstOrDefault(item => item.Name.Equals("MyLayout"));
//Get the layout associated with the layout project item
Layout layout = await QueuedTask.Run(() => someLytItem.GetLayout()); //Worker thread
//Create the new pane - call on UI
ILayoutPane iNewLayoutPane = await ProApp.Panes.CreateLayoutPaneAsync(layout); //GUI thread
Target Platforms: Windows 11, Windows 10
ArcGIS Pro version: 3 or higher.