【ArcGIS Pro二次开发】(13):ProWindow的用法
ProWindow是ArcGIS Pro SDK中的一个WPF控件,具有以下特点:
-
可扩展性:ProWindow提供了丰富的API和样式,可以轻松地扩展和自定义ArcGIS Pro应用程序的UI。
-
可定制性:ProWindow支持多种UI控件和布局方式,可以创建符合自己需求的UI。
-
易用性:ProWindow是一个标准的WPF控件,使用起来非常简单。
总之,使用ProWindow可以轻松地为ArcGIS Pro应用程序添加自定义的用户界面元素,以增强应用程序的功能和易用性。
下面以一个小例子演示ProWindow窗口,Label、Button、Combobox等WPF控件的简单使用方法,同时复习一下图层、字段基本操作等内容。
一、要实现的功能

如上图所示,创建一个ProWindow示例窗口,通过下拉框选择要素图层,或通过按钮打开一个要素类,在第二个下拉框中列出该要素图层的所有字段名,再通过点击显示字段值按钮,在列表框中显示该字段的所有字段值。
二、Pro Window窗口的创建和UI设计
1、Pro Window窗口

在解决方案中右键点添加——新建项,选择:ArcGIS Pro ProWindow,如上图所示。
创建后的新窗口如下,左上是主窗口,是设计的主体。中间是属性栏,在这里可以手动编辑名称、标题、窗体大小、显示文字等属性。最右侧是工具箱窗口,包含默认的所有WPF控件,可以左键直接拖动到主窗口界面,直接创建控件,很方便。

从工具箱直接拖动2个Label控件、2个Button控件、2个ComboBox控件和1个ListBox控件,摆好位置,如下图:
摆控件的时候有一个技巧,就是锁定距离,可以控制和窗口边界或和其它控件的距离,这样窗口被拉伸的时候,也能保持位置,不至于发现形变。

2、Label控件

Label控件很简单,就是个标签,基本不会在它上面创建什么事件,只要注意标签文本内容和字体就行了。
3、Button控件

Button控件主要功能一般就是配一个点击事件,然后处理这个事件即可。如上面所示,在属性栏的事件窗口下,有很多可用的事件,这里用到了Click事件,可以手动输入事件名,再按下【Enter】键,就会在对应的cs文件中添加一个对应名的方法。当然,你直接双击主窗口的控件,也会自动生成并命名事件。
4、ComboBox控件

ComboBox控件是一个下拉框列表,主要的2个属性,【IsEditable】勾选后可以编辑,【Items】可以预先编辑好下拉框里的内容。
它的主要事件是【DropDownOpened】,即点击下拉框,展开列表时触发的事件。
5、Listbox控件
Listbox是1个列表框,主要用来以列表的方式展示内容。一般不涉及事件触发。
三、功能实现流程
之前自动创建的事件代码全部都在ProWindow1.xaml.cs中,通过事件名找到对应的代码块。
1、通过下拉框选择当前地图的要素图层
//清除combox当前的列表内容combox_feature.Items.Clear();// 获取当前地图var map = MapView.Active.Map;// 获取地图中所有要素图层var list_layers = map.GetLayersAsFlattenedList().OfType<FeatureLayer>();foreach (var layer in list_layers){//将要素图层加入comboxcombox_feature.Items.Add(layer);}
通过点击下拉框按钮,将当前地图中所有的要素图层加入到下拉框列表中,即可选择你要的要素图层。
2、通过打开对话框选择要素类
OpenItemDialog openDlg = new OpenItemDialog(){Title = "选择一个要素", //打开对话框标题MultiSelect = false, //是否可以多选Filter = ItemFilters.FeatureClasses_All, //类型筛选};//打开对话框bool? ok = openDlg.ShowDialog();//如果没有选择内容,则返回if (!ok.HasValue || openDlg.Items.Count() == 0)return;//如果有选择内容,返回选择的内容var item = openDlg.Items.First();//将选择的内容置入comboxcombox_feature.Text = item.Path;
这是简单的打开对话框选择要素类,之前的系列文章已经写过了。
3、点击字段名列表combox_field控件时,列出所有字段名
// 清空combox_fieldcombox_field.Items.Clear();await QueuedTask.Run(async () =>{// 获取所选图层的所有字段var fields = layer.GetFieldDescriptions();foreach (var field in fields){await QueuedTask.Run(() =>{// 在UI线程上执行添加item的操作Application.Current.Dispatcher.Invoke(() =>{// 将所有字段名添加到combox_field中combox_field.Items.Add(field.Name);});});}});
当事件触发时,通过layer.GetFieldDescriptions()方法获取所有字段,并添加到combox_field的Items里,这样下拉列表里就会列出所有的字段。
4、点击按钮,在列表框中显示所有字段值
List<string> values = new List<string>(); // 打开要素图层的表格var table = initLayer.GetTable();// 定位到属性表的游标using (var tableCursor = table.Search(null, false)){while (tableCursor.MoveNext()){// 获取当前记录的值var row = tableCursor.Current;var currentValue = row[init_fieldname];// 将不重复的字段值加入listbox_fieldif (values.Contains(currentValue.ToString())){continue;}else{values.Add(currentValue.ToString());// 切换回 UI 线程上下文,将字段值添加到 ListBox 控件中Dispatcher.Invoke(() =>{listbox_field.Items.Add(currentValue.ToString());});}}}});
先创建一个空列表values,用来储存字段值。
通过GetTable()方法获取要素图层的属性表,再逐行搜索字段值,如果出现新的值,就存入values,并放到listbox_field的Items,即可显示在列表框里了。
以上只列出几个步骤的核心代码,完整的可以看文章末尾放出的工程文件。我是ArcGIS Pro SDK和C#的初学者,代码也仅仅是可运行,代码质量肯定是不好,特别是C#的多线程,差点没把我搞晕,大伙凑和着看吧。
四、工程文件分享
最后,放上工程文件的链接:
WPFProWindow
https://pan.baidu.com/s/1zvyF03K008lBrspHhZ3lRw?pwd=kzuw
PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。
相关文章:
【ArcGIS Pro二次开发】(13):ProWindow的用法
ProWindow是ArcGIS Pro SDK中的一个WPF控件,具有以下特点: 可扩展性:ProWindow提供了丰富的API和样式,可以轻松地扩展和自定义ArcGIS Pro应用程序的UI。 可定制性:ProWindow支持多种UI控件和布局方式,可以…...
HTML/CSS/JS 基本语法
前端一、HTNL1、文件结构2、文本标签(1)块元素:div(2)行内元素:span(3)格式标签3、图片、音频、视频(1)图片(2)音频< audio >&a…...
对于从事芯片行业的人来说,有哪些知识是需要储备的?
近两年芯片行业大火,不少同学想要转行,却不知道该如何下手,需要学习哪些基础知识,下面就来看看资深工程师怎么说? 随着工艺的发展,芯片肯定是尺寸越来越小,至于小到什么样的程度是极限…...
测试场景设计
测试场景设计 又叫做场景法。其实对于场景法是测试用例中面临最多的,但是这种模式不是很容易总结,有时候是基于经验,有时候是我们对系统的了解。所以在这种情况下,我们强硬的用场景法对其进行规范。 场景法原理 现在的软件几乎…...
《重构》增强代码可读性
文章目录重构原则何为重构为何重构何时重构重构会影响性能吗实例原始类进行重构分解statements方法提取函数搬移函数提炼“积分计算”功能去除临时变量(以查询取代临时变量)运用多态取代与价格相关的条件逻辑代码迁移Movie类Price类 状态模式搬移函数以多…...
数据分析自学路线
数据分析作为近几年火起来的IT技术岗位,在大数据时代的浪潮下迅速发酵膨胀,席卷了众多互联网企业,漫延到了金融、教育、医疗、消费等传统行业,在新经济领域也有重要作用,比如人工智能、新能源、电子芯片、企业数字化服…...
蓝桥杯C++组怒刷50道真题
🌼深夜伤感网抑云 - 南辰Music/御小兮 - 单曲 - 网易云音乐 🌼多年后再见你 - 乔洋/周林枫 - 单曲 - 网易云音乐 50题才停更,课业繁忙,有时间就更,2023/3/14/15:06写下 目录 👊填空题 🌼一…...
【期末小作业】HTML、CSS前端静态网页
分享一个可以“趁别人喝咖啡的功夫“”写的一个静态网页,纯纯练手小项目,适合前端刚入门的小白练练手。 前端练手静态页面 实现效果图展示 CSS代码 HTML 代码 环境:VScode编辑器 语言:HTML 、CSS 一、实现效果图 仅仅通过…...
Windows逆向安全(一)之基础知识(二)
反汇编分析C语言 空函数反汇编 #include "stdafx.h"//空函数 void function(){}int main(int argc, char* argv[]) {//调用空函数function();return 0; }我们通过反汇编来分析这段空函数 函数外部 12: function(); 00401048 call ILT5(func…...
Python 基础教程【2】:条件语句和循环语句
本文已收录于专栏🌻《Python 基础》文章目录1、流程控制语句1.1 顺序语句1.2 条件语句1.2.1 if语句注意事项1.2.2 三元运算符1.2.3 自动类型转换1.3 循环语句1.3.1 while 循环1.3.2 for-in 循环1.3.3 for...else 循环1.3.4 break 和 continue 的区别2、实践——猜数…...
【React避坑指南】useEffect 依赖引用类型
前言 如果你是一个入行不久的前端开发,面试中多半会遇到一个问题: 你认为使用React要注意些什么? 这个问题意在考察你对React的使用深度,因为沉浸式地写过一个项目就会发现,不同于一些替你做决定的框架,“…...
Android binder通信实现进程间通信
一.binder通信原理Binder 是 Android 系统中用于跨进程通信的一种机制,它允许一个进程中的组件与另一个进程中的组件进行通信,从而实现进程间通信 (IPC)。Binder 机制是基于 Linux 内核提供的进程间通信机制 (IPC) 实现的。在 Binder 机制中,…...
2023年BeijngCrypt勒索病毒家族最新变种之.halo勒索病毒
目录 前言:简介 一、什么是.halo勒索病毒? 二、.halo勒索病毒是如何传播感染的? 三、感染.halo后缀勒索病毒建议立即做以下几件事情 四、中了.halo后缀的勒索病毒文件怎么恢复? 五、加密数据恢复情况 六、系统安全防护措施建…...
【LeetCode】BM1 反转链表、NC21 链表内指定区间反转
作者:小卢 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 BM1 反转链表 描述: 给定一个单链表的头结点pHead(该头节点是有值的,…...
拼多多24届暑期实习真题
1. 题目描述: 多多开了一家自助餐厅,为了更好地管理库存,多多君每天需要对之前的课流量数据进行分析,并根据客流量的平均数和中位数来制定合理的备货策略。 2. 输入输出描述: 输入描述: 输入共两行&#x…...
JS高级知识总结
文章目录1. this指向问题2. 对象进阶2.1 对象的定义和使用2.2 对象访问器2.2.1 Getter2.2.2 Setter2.3 对象构造器2.4 对象原型2.4.1 prototype属性2.4.2 \_\_proto\_\_ 属性2.4.3 constructor属性2.4.4 原型链2.5 Object对象2.5.1 管理对象2.5.2 保护对象3. 函数进阶3.1 函数的…...
Jenkins+Docker+Maven+gitlab实现自动构建、远程发布
前言 一个项目完整的生命周期是从开发的coding阶段和coding阶段的质量测试,再到多次发布投入使用。目前大部分的测试阶段并不是从coding结束后开始的,而是和coding同步进行的。可能今天早上coding完成一个功能,下午就要投入测试。在这期间&a…...
centos7克隆虚拟机完成后的的一些配置介绍
系列文章目录 centos7配置静态网络常见问题归纳_张小鱼༒的博客-CSDN博客 文章目录 目录 系列文章目录 前言 一、配置Hadoop要下载的压缩包 1、下载对应版本的Hadoop压缩包 2、我们如何查看自己电脑的端口号 3、下载jdk对应的版本 二、虚拟机centos7克隆虚拟机完成后的一些基本…...
C语言/动态内存管理函数
C程序运行时,内存将被划分为三个区域,而动态开辟的内存区间位于堆区。 文章目录 前言 一、内存划分 二、malloc函数 三、calloc函数 四、realloc函数 五、free函数 总结 前言 在使用C语言编写程序时,使用动态内存是不可避免的&#x…...
华为OD机试题,用 Java 解【任务调度】问题
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不要…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
