最近项目中需要用到在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. tensorflow 1.8, ubuntu 16.04, cuda 9.0, nvidia-390,安装踩坑指南。

    被tensorflow 1.8, ubuntu 16.04, cuda 9.0, nvidia-390折磨了5天,终于上坑,留下指南,造福后人. 1.先把依赖搞清楚: tensorflow 1.8依赖 ...

  2. Pat1108: Finding Average

    1108. Finding Average (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The b ...

  3. grub rescue 主引导修复

    使用windows 和 ubuntu 双系统的人,很有可能碰到重装某一个系统,或者另外添加分区,导致系统重启出现 : GRUB loading error:unknow filesystem grub ...

  4. Scrapy 1.4 文档 02 安装指南

    安装 Scrapy Scrapy 运行在 Python 2.7 和 Python 3.3 或更高版本上. 如果您使用的是 Anaconda 或 Miniconda,则可以从 conda-forge 通 ...

  5. Open-Source Service Discovery

    Service discovery is a key component of most distributed systems and service oriented architectures. ...

  6. eclipse工具的使用心得

    一.eclipse工具的使用 eclipse是一个开源的IDE,进行javaEE开发一般使用myeclipse插件比较方便 1. java代码的位置 1)选择工作空间workspace 选择一个文件夹 ...

  7. 33.APP后端处理视频的方案

    在当前的app应用中,到处都能看到视频的身影,例如,在社交类的app上,用户可以拍摄属于自己的小视频,并发布到相应得栏目,增加和好友们互动的机会. 后台常见的视频处理有以下几种: ·          ...

  8. 关于find命令的一些知识

    在服务器运维的过程中,我们会用到这样一个命令,关于这个命令,你知道多少呢?接下来,咱们一起来研究一下它的用途. find命令主要用来在硬盘上搜索文件, find命令主要用于文件查找,列出当前目录及子目 ...

  9. MVC下 把数据库中的byte[]值保存成图片,并显示在view页面

    MVC下 把数据库中的byte[]值转成图片,并显示在view页面 controller中的action方法 //显示图片[AllowAnonymous]public ActionResult Sho ...

  10. 【线段树】Bzoj1230 [Usaco2008 Nov]lites 开关灯

    Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每 ...