ArcGIS Pro SDK (四)框架 1

ArcGIS Pro SDK 框架 1

目录

  • [ArcGIS Pro SDK 框架 1](#ArcGIS Pro SDK 框架 1)
    • [1 如何在停靠窗格可见或隐藏时订阅和取消订阅事件](#1 如何在停靠窗格可见或隐藏时订阅和取消订阅事件)
    • [2 执行命令](#2 执行命令)
    • [3 设置当前工具](#3 设置当前工具)
    • [4 激活选项卡](#4 激活选项卡)
    • [5 激活/停用状态 - 修改条件](#5 激活/停用状态 - 修改条件)
    • [6 确定应用程序是否繁忙](#6 确定应用程序是否繁忙)
    • [7 获取应用程序主窗口](#7 获取应用程序主窗口)
    • [8 关闭 ArcGIS Pro](#8 关闭 ArcGIS Pro)
    • [9 获取 ArcGIS 专业版](#9 获取 ArcGIS 专业版)
    • [10 关闭特定窗格](#10 关闭特定窗格)
    • [11 激活窗格](#11 激活窗格)
    • [12 获取有关当前安装的加载项的信息](#12 获取有关当前安装的加载项的信息)
    • [13 查找码头窗格](#13 查找码头窗格)
    • [14 码头窗格属性和方法](#14 码头窗格属性和方法)
    • [15 码头窗格撤消/重做](#15 码头窗格撤消/重做)
    • [16 查找停靠窗格并获取其视图模型](#16 查找停靠窗格并获取其视图模型)
    • [17 打开"后台"选项卡](#17 打开“后台”选项卡)

1 如何在停靠窗格可见或隐藏时订阅和取消订阅事件

csharp 复制代码
private SubscriptionToken _eventToken = null;
// 当DockPane的可见性改变时调用
protected override void OnShow(bool isVisible)
{
  if (isVisible && _eventToken == null) // 当dockpane可见时订阅事件
  {
    _eventToken = MapSelectionChangedEvent.Subscribe(OnMapSelectionChangedEvent);
  }

  if (!isVisible && _eventToken != null) // 当dockpane关闭时取消订阅
  {
    MapSelectionChangedEvent.Unsubscribe(_eventToken);
    _eventToken = null;
  }
}
// MapSelection事件触发时的事件处理程序
private void OnMapSelectionChangedEvent(MapSelectionChangedEventArgs obj)
{
  MessageBox.Show("选择发生了变化");
}

2 执行命令

csharp 复制代码
IPlugInWrapper wrapper = FrameworkApplication.GetPlugInWrapper("esri_editing_ShowAttributes");
var command = wrapper as ICommand; // 工具和命令(按钮)支持此功能

if ((command != null) && command.CanExecute(null))
  command.Execute(null);

3 设置当前工具

csharp 复制代码
// 使用 SetCurrentToolAsync
FrameworkApplication.SetCurrentToolAsync("esri_mapping_selectByRectangleTool");

// 或使用 ICommand.Execute
ICommand cmd = FrameworkApplication.GetPlugInWrapper("esri_mapping_selectByRectangleTool") as ICommand;
if ((cmd != null) && cmd.CanExecute(null))
  cmd.Execute(null);

4 激活选项卡

csharp 复制代码
FrameworkApplication.ActivateTab("esri_mapping_insertTab");

5 激活/停用状态 - 修改条件

csharp 复制代码
// 根据状态在DAML文件中定义条件
if (activate)
  FrameworkApplication.State.Activate("someState");
else
  FrameworkApplication.State.Deactivate("someState");

6 确定应用程序是否繁忙

csharp 复制代码
// 如果一个任务当前正在主工作线程上运行,或者任何窗格或停靠窗格报告它正在繁忙或正在初始化,则认为该应用程序繁忙。

// 许多Pro的样式(如Esri_SimpleButton)确保在框架应用程序时禁用按钮。IsBusy为true
// 您可以使用此属性绑定到dockpane或窗格上控件(例如listbox)的IsEnabled属性,以便在应用程序繁忙时禁用它。
bool isbusy = FrameworkApplication.IsBusy;

7 获取应用程序主窗口

csharp 复制代码
System.Windows.Window window = FrameworkApplication.Current.MainWindow;

Rect rect = System.Windows.SystemParameters.WorkArea;
FrameworkApplication.Current.MainWindow.Left = rect.Left + (rect.Width - FrameworkApplication.Current.MainWindow.ActualWidth) / 2;
FrameworkApplication.Current.MainWindow.Top = rect.Top + (rect.Height - FrameworkApplication.Current.MainWindow.ActualHeight) / 2;

8 关闭 ArcGIS Pro

csharp 复制代码
FrameworkApplication.Close();

9 获取 ArcGIS 专业版

csharp 复制代码
// "GetEntryAssembly"应该是ArcGISPro.exe
string version = System.Reflection.Assembly.GetEntryAssembly()
                                       .GetName().Version.ToString();

10 关闭特定窗格

csharp 复制代码
string _viewPaneID = "my pane"; // pane 的 DAML ID
                                // 窗格可以有多个实例(InstanceIDs)。
                                // 因此,您可以遍历窗格以只获取"您的"窗格
IList<uint> myPaneInstanceIDs = new List<uint>();
foreach (Pane pane in FrameworkApplication.Panes)
{
  if (pane.ContentID == _viewPaneID)
  {
    myPaneInstanceIDs.Add(pane.InstanceID); // pane的InstanceID,可以是多个,所以构建集合       
  }
}
foreach (var instanceID in myPaneInstanceIDs) // 关闭每个"你的"窗格。
{
  FrameworkApplication.Panes.ClosePane(instanceID);
}

11 激活窗格

csharp 复制代码
var mapPanes = ProApp.Panes.OfType<IMapPane>();
foreach (Pane pane in mapPanes)
{
  if (pane.Caption == "MyMap")
  {
    pane.Activate();
    break;
  }
}

12 获取有关当前安装的加载项的信息

csharp 复制代码
var addin_infos = FrameworkApplication.GetAddInInfos();
StringBuilder sb = new StringBuilder();

foreach (var info in addin_infos)
{
  if (info == null)
    break;

  sb.AppendLine($"Addin: {info.Name}");
  sb.AppendLine($"Description {info.Description}");
  sb.AppendLine($"ImagePath {info.ImagePath}");
  sb.AppendLine($"Author {info.Author}");
  sb.AppendLine($"Company {info.Company}");
  sb.AppendLine($"Date {info.Date}");
  sb.AppendLine($"Version {info.Version}");
  sb.AppendLine($"FullPath {info.FullPath}");
  sb.AppendLine($"DigitalSignature {info.DigitalSignature}");
  sb.AppendLine($"IsCompatible {info.IsCompatible}");
  sb.AppendLine($"IsDeleted {info.IsDeleted}");
  sb.AppendLine($"TargetVersion {info.TargetVersion}");
  sb.AppendLine($"ErrorMsg {info.ErrorMsg}");
  sb.AppendLine($"ID {info.ID}");
  sb.AppendLine("");
}
System.Diagnostics.Debug.WriteLine(sb.ToString());
MessageBox.Show(sb.ToString(), "Addin Infos");

13 查找码头窗格

csharp 复制代码
// 根据DAML id找到dockpane
var pane = FrameworkApplication.DockPaneManager.Find("esri_core_ProjectDockPane");

14 码头窗格属性和方法

csharp 复制代码
// 根据DAML id找到dockpane
var pane = FrameworkApplication.DockPaneManager.Find("esri_core_ProjectDockPane");

// 控制可见性
bool visible = pane.IsVisible;

// 使dockpane激活
pane.Activate();

// 控制dockpane状态
DockPaneState state = pane.DockState;

// 钉住
pane.Pin();

// 隐藏
pane.Hide();

15 码头窗格撤消/重做

csharp 复制代码
var pane = FrameworkApplication.DockPaneManager.Find("esri_core_contentsDockPane");

// 获取撤销栈
OperationManager manager = pane.OperationManager;
if (manager != null)
{
  // 撤销操作
  if (manager.CanUndo)
    await manager.UndoAsync();

  // 重做操作
  if (manager.CanRedo)
    await manager.RedoAsync();

  // 清除特定类别操作的撤销和重做栈
  manager.ClearUndoCategory("Some category");
  manager.ClearRedoCategory("Some category");
}

16 查找停靠窗格并获取其视图模型

csharp 复制代码
// 下面是一个定义了dockpane的DAML示例。找到dockpane后,可以将其转换为dockpane viewModel,该viewModel由className属性定义。
//<dockPanes>
//  <dockPane id="MySample_Dockpane" caption="Dockpane 1" className="Dockpane1ViewModel" dock="bottom" height="5">
//    <content className="Dockpane1View" />
//  </dockPane>
//</dockPanes>

Dockpane1ViewModel vm = FrameworkApplication.DockPaneManager.Find("MySample_Dockpane") as Dockpane1ViewModel;

17 打开"后台"选项卡

csharp 复制代码
// 打开后台到"关于ArcGIS Pro"选项卡。
FrameworkApplication.OpenBackstage("esri_core_aboutTab");
相关推荐
mudtools12 小时前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
c#·.net
大飞pkz18 小时前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式
你是一个铁憨憨19 小时前
ArcGIS定向影像(1)——非传统影像轻量级解决方案
arcgis·gis·影像·定向影像
QQ35967734519 小时前
ArcGIS Pro实现基于 Excel 表格批量创建标准地理数据库(GDB)——高效数据库建库解决方案
数据库·arcgis·excel
唐青枫20 小时前
从入门到进阶:C#.NET Stopwatch 计时与性能测量全攻略
c#·.net
未来之窗软件服务1 天前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟
1uther1 天前
Unity核心概念⑨:Screen
开发语言·游戏·unity·c#·游戏引擎
阿幸软件杂货间1 天前
Office转PDF转换器v1.0.py
开发语言·pdf·c#
sali-tec1 天前
C# 基于halcon的视觉工作流-章34-环状测量
开发语言·图像处理·算法·计算机视觉·c#
Tiger_shl1 天前
【层面一】C#语言基础和核心语法-02(反射/委托/事件)
开发语言·c#