最近项目中需要用到在TOC监听图层的变化,从而针对添加的不同图层进行不同的操作。但是当TOC中添加图层组时,无法监听到图层组中添加图层的动作。也就无法获取到向图层组中添加的图层。

在开发手册中也没有找到相应的事件接口来实现。于是就动手自己写了一个事件监听。

实现的思路是,自己构建事件接口,然后构建一个GroupLayer的子类来实现这个接口。

具体看代码:

///////////////////////////////
/////// 事件接口的代码
// 构建图层组图层增加的委托
public delegate void IGroupLayerEvents_ItemAddedEventHandler(object Item);
// 构建图层组图层移除的委托
public delegate void IGroupLayerEvents_ItemDeletedEventHandler(object Item); // 构建图层组事件接口
public interface IGroupLayerEvents
{
// 增加项事件
event IGroupLayerEvents_ItemAddedEventHandler ItemAdded;
// 移除项事件
event IGroupLayerEvents_ItemDeletedEventHandler ItemDeleted;
}
////////////
///构建GroupLayerClass的子类
// 构建GrouplayerClassEx类继承Esri的GroupLayer并实现自定义的IG肉pLayerEvents接口
public class GroupLayerClassEx:GroupLayerClass,IGroupLayerEvents
{
#region IGroupLayerEvents 成员
public event IGroupLayerEvents_ItemAddedEventHandler ItemAdded;
public event IGroupLayerEvents_ItemDeletedEventHandler ItemDeleted;
#endregion // 重写添加的方法
public override void Add(ILayer layer)
{
base.Add(layer);
// 实现事件
if (ItemAdded != null)
{
ItemAdded(layer);
}
} // 重写清除的方法
public override void Clear()
{
// 遍历图层实现项减少的事件
if (ItemDeleted != null)
{
ICompositeLayer pCompositeLayer = this as ICompositeLayer;
for (int i = 0; i < pCompositeLayer.Count; i++)
{
ILayer pCurrentLayer = pCompositeLayer.get_Layer(i);
ItemDeleted(pCurrentLayer);
}
}
base.Clear();
} // 重写删除的方法
public override void Delete(ILayer Layer)
{
base.Delete(Layer);
if (ItemDeleted != null)
{
ItemDeleted(Layer);
}
}
···
其他IGroupLayer接口实现的方法和属性都要override一遍。
···
}

在地图控件事件中进行监听

 private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
{
AxMapControl pAxMapControl = sender as AxMapControl; // 注册事件
mEvent = pAxMapControl.ActiveView.FocusMap as IActiveViewEvents_Event;
mEvent.ItemAdded += new IActiveViewEvents_ItemAddedEventHandler(Event_ItemAdded);
mEvent.ItemDeleted += new IActiveViewEvents_ItemDeletedEventHandler(Event_ItemDeleted);
}
private void Event_ItemAdded(object Item)
{
if (Item is IGroupLayer)
{
IGroupLayerEvents pIGroupLayerEvents = Item as IGroupLayerEvents;
if (pIGroupLayerEvents != null)
{
pIGroupLayerEvents.ItemAdded += new IGroupLayerEvents_ItemAddedEventHandler(Event_ItemAdded);
pIGroupLayerEvents.ItemDeleted += new IGroupLayerEvents_ItemDeletedEventHandler(Event_ItemDeleted);
}
}
}

ArcEngine GroupLayer监听图层改变的更多相关文章

  1. 实时监听 JavaScript改变 input 值 input输入框内容 value 变化实时监听

    思路:通过setInterval()方法去定时对比新旧值 当时候JavaScript的onchange 和onpropertychange(注意ie版本) 监听输入框input时间,人为改变值是可以触 ...

  2. 利用Node的chokidar 监听文件改变的文件。

    最近维护一个项目.每次改完东西,都要上传到服务器.然后有时候就忘记一些东西,于是就想有没有可以方法能监听文件的改变.然后我再利用程序把更改的文件一键上传到服务器. 于是就找到了nodejs 的chok ...

  3. React router内是如何做到监听history改变的

    问题背景 今天面试的时候,被问到这么个问题.在html5的history情况下,pushstate和replacestate是无法触发pushstate的事件的,那么他是怎么做到正确的监听呢?我当时给 ...

  4. js进阶 12-6 监听鼠标滚动事件和窗口改变事件怎么写

    js进阶 12-6 监听鼠标滚动事件和窗口改变事件怎么写 一.总结 一句话总结:滚动事件scroll(),浏览器窗口调整监听resize(),思考好监听对象. 1.滚动事件scroll()的监听对象是 ...

  5. 2016-1-6第一个完整APP 私人通讯录的实现 2:增加提示用户的提示框,监听文本框

    一:在登录时弹出提示用户的提示框: 1.使用第三方框架. 2.在登陆按钮点击事件中增加如下代码: - (IBAction)loginBtnClicked { NSString *acount = se ...

  6. ios中键值编码kvc和键值监听kvo的特性及详解

    总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  ...

  7. 如何监听input的脚本赋值

    今天记录下我解决input值改变监听,大家肯定首先想到onchange方法.对于实时监听改变用onpropertychange.oninput等方法:可是,onchange并不能监听脚本改变的值,对于 ...

  8. Android 动态监听网络 断网重连

    需求: 网络连接断开 弹出popupwindow 当前网络连接断开 网络恢复时popupwindow 消失重新请求网络. 需求描述完毕 上一张帅图 思路:广播 发送及时消息 断网flag  popup ...

  9. Android开发 ---基本UI组件5:监听下拉选项,动态绑定下拉选项、全选/反选,取多选按钮的值,长按事件,长按删除,适配器的使用,提示查询数据,activity控制多按钮

    效果图: 效果描述: 1.当点击 1 按钮后,进入选择城市的页面,会监听到你选中的城市名称:动态为Spinner绑定数据 2.当点击 2 按钮后,进入自动查询数据页面,只要输入首字母,就会动态查找以该 ...

随机推荐

  1. python_特殊函数

    __new__() 类的静态方法,用于确定是否要创建对象__init__() 构造函数,生成对象时调用__del__() 析构函数,释放对象时调用__add__() +__sub__() -__mul ...

  2. Unity3D学习(七):Unity多重采样抗锯齿设置无效的解决办法

    前言 学习Shader的过程中发现模型锯齿严重,于是去Edit--Project Settings--Quality选项下将反锯齿设置为了8X Multi Sampling.结果没有任何改变,如图: ...

  3. Linux内核架构与底层--读书笔记

    linux中管道符"|"的作用 命令格式:命令A|命令B,即命令1的正确输出作为命令B的操作对象(下图应用别人的图片) 1. 例如: ps aux | grep "tes ...

  4. 【网络】TCP/IP连接三次握手

    TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确 ...

  5. JDK安装遇见的问题及解决方案

    问题描述: Jdk安装完成后从新启动电脑,打开eclipse报找 不到JRE或JDK,在cmd中输入  java -version 也不显示JDK信息. 后把JDK配置的环境变量path的JAVA_H ...

  6. Linux设置开放一个端口

    修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,如果要开放哪个端口,在里面添加一条. -A RH-Firewall-1-INPUT -m state --state ...

  7. 附录D——自动微分(Autodiff)

    本文介绍了五种微分方式,最后两种才是自动微分. 前两种方法求出了原函数对应的导函数,后三种方法只是求出了某一点的导数. 假设原函数是$f(x,y) = x^2y + y +2$,需要求其偏导数$\fr ...

  8. Dubbo源码-Dubbo是如何随心所欲自定义XML标签的

    叨叨 今天考虑了很久要不要写这篇文章. 距离<Dubbo源码>系列的开篇到现在已经快两个月时间了.当时是想着工作上的RPC框架使用存在一些让人头疼的问题,就来看看Dubbo给出了一套什么样 ...

  9. SQL Server 2000安装教程图解

    SQL Server 2000安装教程图解... ============= 下面网盘链接中的SQL2000数据库在Win7和Win10系统上安装都是可以正常使用的,只不过是Win10上安装的话,需要 ...

  10. Oracle解决Ora-01653无法扩展表空间问题

    先针对可能性1查看表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M) & ...