Exception | Description |
---|---|
ArcGIS.Core.CalledOnWrongThreadException | This method or property must be called within the lambda passed to QueuedTask.Run. |
//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; }); } }
//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
//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
//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}"); } });
//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}"); } });
//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); });
//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 }
//This sample checks to see if a layout project item already has an open application pane. //If it does, it checks if it is the active layout view, if not, it creates, activates and opens a new pane. //Reference a layoutitem in a project by name LayoutProjectItem layoutItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("Layout View")); //Get the layout associated with the layoutitem Layout lyt = await QueuedTask.Run(() => layoutItem.GetLayout()); //Iterate through each pane in the application and check to see if the layout is already open and if so, activate it foreach (var pane in ProApp.Panes) { var layoutPane = pane as ILayoutPane; if (layoutPane == null) //if not a layout pane, continue to the next pane continue; if (layoutPane.LayoutView.Layout == lyt) //if the layout pane does match the layout, activate it. { (layoutPane as Pane).Activate(); layoutPane.Caption = "This is a test"; System.Windows.MessageBox.Show(layoutPane.Caption); return; } } //Otherwise, create, open, and activate the layout if not already open ILayoutPane newPane = await ProApp.Panes.CreateLayoutPaneAsync(lyt); //Zoom to the full extent of the layout await QueuedTask.Run(() => newPane.LayoutView.ZoomTo100Percent());
//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
//Change the layout page size. //Reference the layout project item LayoutProjectItem lytItem = Project.Current.GetItems<LayoutProjectItem>() .FirstOrDefault(item => item.Name.Equals("MyLayout")); if (layoutItem != null) { await QueuedTask.Run(() => { //Get the layout Layout lyt = lytItem.GetLayout(); if (lyt != null) { //Change properties CIMPage page = lyt.GetPage(); page.Width = 8.5; page.Height = 11; //Apply the changes to the layout lyt.SetPage(page); } }); }
Target Platforms: Windows 11, Windows 10