ArcGIS Pro 3.4 API Reference Guide
ArcGIS.Desktop.Layouts Namespace / LayoutProjectItem Class
Members Example Version

LayoutProjectItem Class
Represents a layout project item.
Object Model
LayoutProjectItem ClassLayout ClassTimeInstant Class
Syntax
public sealed class LayoutProjectItem : ArcGIS.Desktop.Internal.Core.ProjectItem, ArcGIS.Desktop.Core.IMetadata, ArcGIS.Desktop.Core.IProjectItem, System.ComponentModel.INotifyPropertyChanged  
Remarks

Each Layout in a project is associated with a LayoutProjectItem. This item contains numerous read-only metadata properties about the layout. Although a layout may exist in the project, it may not be loaded (an open layout view). To reference the actual layout and ensure it is loaded into memory, you must use the GetLayout method.

Example
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
Inheritance Hierarchy

System.Object
   ArcGIS.Desktop.Framework.Contracts.PropertyChangedBase
      ArcGIS.Desktop.Core.Item
            ArcGIS.Desktop.Layouts.LayoutProjectItem

Requirements

Target Platforms: Windows 11, Windows 10

ArcGIS Pro version: 3 or higher.
See Also