一、简介
此工具要实现的功能是:将内容框中当前选定的图层移到最顶层或最底层。
主要技术要点包括:
1、Config.daml文件设置(UI设置)
2、按钮的图片和位置设置
3、当前选定图层的获取
4、图层在内容列表中位置的获取和移动
二、前端
1、UI界面的初步搭建
创建一个ArcGIS Pro模块加载项,注意是C#,不是下面那个VB的类型。

在项目中,右键点击【项目】,添加1个【新建项】:

添加2个【ArcGIS Pro按钮】,分别命名为【btn_front.cs】和【btn_back.cs】。

打开【Config.daml】,对UI界面做一个设置。
<tabs>是标签栏,里面的内容默认是被注释掉的。将其选择后,按【Ctrl+K+U】将注释取消。
(快速注释的快捷键是【Ctrl+K+C】)

然后将caption(即标签栏的文字)改一个值,如【二次开发实例】。
<groups>是标签栏下的分组栏,刚才创建的2个Button默认就放在第1个group里。
将这个group的caption改为【初级教程】。
appearsOnAddInTab属性为是否将group放在系统默认的1个标签栏里,一般就改为【false】。

初步设置完毕,点击【调试】,VS会自动打开ArcGIS Pro。

在打开的ArcGIS Pro工程里查看,会发现1个【二次开发实例】标签栏,下面有1个【初级教程】分组栏,里面有2个按钮【btn_front.cs】和【btn_back.cs】。

2、按钮图标设置
下面要对按钮做一下设置,目前按钮的图标是默认的,我们用自己的图片替换一下。
先准备好图片,格式为PNG,需要2种尺寸,32*32和16*16。
一个小TIPS,Arcgis软件安装后,本地就有一些图片可以用。

在当前工程下的【Images】文件夹,把需要的png放进去,方便管理。

下面是比较关键的一步,在VS里多选这几张图片,在属性栏中,将生成操作设置为【内容】。

回到【Config.daml】中,找到<controls>,新建的2个button在这里,顺便修改一下它们的caption。
然后将它们的smallImage和LargeImage分别设置为图片在工程中的相对路径。

因为VS调试的热重载对UI部分的变化不会起作用。因此需要关闭刚才启用的调试,并再次点击调试。

点击调试后,在启动的ArcGIS Pro里查看,已更新成我们自己设置的图片:

3、把按钮的启动位置设置到图层的右键菜单里
这个工具的功能是设置图层的位置,因此将按钮的启动位置整合到图层的右键菜单里更为方便一些。
打开【Config.daml】,在<insertModule>后面插入一个<updateModule>模板,refID设为【esri_mapping】。(建议这部分直接抄一下我的源代码,再手动修改。)

添加2个<updateMenu>,refID分别为【esri_mapping_layerContextMenu】和【esri_mapping_unregisteredLayerContextMenu】,分别代表的是数据库要素和SHP要素的右键菜单,二者都不可缺少。
<updateMenu>下面放置<insertButton>,refID设置为我们添加的2个按钮的id即可。
insert和placeWith是为了控制按钮在菜单中的位置,截图中设置的结果是放在ID为【esri_mapping_copySelectedLayersButton】的【复制】按键前面。这个可自行设置。

设置完成,再次重新调试,可以看到结果如上。
至此,前端UI部分的工作已经完成。
三、后端
1、后置按钮的点击事件
打开【btn_back.cs】,在OnClick事件下写我们的主要代码。
ArcGIS Pro SDK的大部分接口都需要异步执行。
(异步的知识点可以看下这个:ArcGIS Pro中的多线程)。
因此,我习惯于把所有代码都放在QueuedTask下,如果遇到UI部分的内容再单独处理。
同时OnClick事件上需要加一个修饰符async表示异步:

主流程部分比较简单,先获取工程当前地图中的所有选定的图层,再把图层逐个移动到最底层即可。
cs
protected override async void OnClick()
{
await QueuedTask.Run(() =>
{
// 获取工程的当前地图
Map map = MapView.Active.Map;
// 获取工程当前地图中的所有选定的图层
// 并返回一个图层列表
List<Layer> lys = MapView.Active.GetSelectedLayers().ToList();
// 对列表循环处理
foreach (Layer ly in lys)
{
// 把图层移动到最底层,index参数为-1
map.MoveLayer(ly, -1);
}
});
}
2、前置按钮的点击事件
前置按钮的代码基本上差不多,不过有一点要注意,需要对图层列表进行一个倒排,因为将选定的多个图层一个一个移动到顶层时,结果顺序是反的,所以要先倒排一下列表再移动。
cs
protected override async void OnClick()
{
await QueuedTask.Run(() =>
{
// 获取工程的当前地图
Map map = MapView.Active.Map;
// 获取工程当前地图中的所有选定的图层
// 并返回一个图层列表
List<Layer> lys = MapView.Active.GetSelectedLayers().ToList();
// 对图层列表进行一个倒排
// 因为将选定的多个图层一个一个移动到顶层时,结果顺序是反的,所以要先倒排一下列表再移动
lys.Reverse();
// 对列表循环处理
foreach (Layer ly in lys)
{
// 把图层移动到最顶层,index参数为0
map.MoveLayer(ly, 0);
}
});
}
四、调试
点击调试,如图所示,选定【图层2和图层3】,右键点击后置:

点击前置:

完美。
五、工程文件下载
工程文件地址如下,在文件夹中找到【要素图层的前置后置】下载即可。
【ArcGIS Pro二次开发实例教程】原代码合集https://pan.baidu.com/s/1HuS7engSHi1uK1sl70xtAQ?pwd=d6ji