ArcEngine GroupLayer监听图层改变

最近项目中需要用到在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);
         }
     }
  }

原文地址:https://www.cnblogs.com/MaFeng0213/p/9073853.html

时间: 2024-07-31 11:19:33

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

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

最近维护一个项目.每次改完东西,都要上传到服务器.然后有时候就忘记一些东西,于是就想有没有可以方法能监听文件的改变.然后我再利用程序把更改的文件一键上传到服务器. 于是就找到了nodejs 的chokidar模块. 然后利用redis的set集合.因为我们频繁更改.如果用普通的字符 会增加比较.set是一个集合,里面的元素都是不重复的.正好可以利用这个特性.帮我们记录更改的记录文件.删除的时候,然后删掉set中的文件.目前只做了增加或修改的文件提交,如果本地删除的 不会同步到服务器. 监听本地文

页面监听状态改变网站Title

长期以来我们一直缺少一个判断用户是否正在浏览某个指定标签页的方法.用户是否去看别的网站了?他们切换回来了么? 现在,HTML5里页面可见性接口就提供给了程序员一个方法,让他们使用visibilitychange页面事件来判断当前页面可见性的状态,并针对性的执行某些任务.同时还有新的document.hidden属性可以使用. document.hidden 这个新出现的document.hidden属性,它显示页面是否为用户当前观看的页面,值为ture或false. document.visib

监听窗口大小改变,同时根据窗口大小修改某个元素的大小

jQuery的方法: <script> $(window).resize(function(){ var width = $(this).width(); var height = $(this).height(); alert('width'+width+'-height'+height); }); </script> 以上的方法,不能写在页面加载完成事件函数$(function(){})内部,而需要写在外面. 页面加载完成事件: $(function(){}); $(docum

groovy修改代码不用重启通过监听记录改变时间重新加载

groovy是一个跟java 很像的脚本语言,基于jvm,写法比java随意一点可以跟java代码很好的集合,如果项目中有用到规则可以在控制层使用groovy编写代码,调用规则. 在spring-mvc的配置文件中配置下面的

UISwitch的方法和监听文本框的文字改变

1.UISwitch * UISwitch继承自UIControl,因此也能像UIButton一样监听一些事件,比如状态改变事件 * UISwitch可以通过拖线监听状态改变 * UISwitch可以通过addTarget:...方法监听状态改变 - (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; // 其中controlEvents参数传递的是:UICo

ios 文本框变化 监听的3种方式

声明属性 @interface LoginControler() <UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UITextField *userName; @end 1,代理方式 -(void) viewDidLoad {     _userName.delegate = self;    //添加代理 } -(BOOL)textField:(UITextField *)textField shouldChangeCha

Android开发之EditText 详解(addTextChangedListener监听用户输入状态)

为了实现像qq或者微信输入框的效果,当在 EditText输入字符串时发送按钮显示,当输入框字符消除掉时按钮改变.所以这时候我就要用到addTextChangedListener 用它来监听用户输入状态.可以在监听中改变用户输入的内容或者提示用户输入内容不合法等等 EditText editText = (EditText)findViewById(R.id.monitor_edit_text0); editText.addTextChangedListener(new TextWatcher(

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

一:在登录时弹出提示用户的提示框: 1.使用第三方框架. 2.在登陆按钮点击事件中增加如下代码: - (IBAction)loginBtnClicked { NSString *acount = self.acountField.text; NSString *password = self.passwordField.text; // 跳出正在登陆的提示框 [MBProgressHUD showMessage:@"正在登陆"]; // 模拟加载中 QAQ 感觉好喜感啊 dispatc

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

总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  3. 动态设置:setValue:属性值 forKey:属性名(用于简单的路径)/setValue:属性值 forKeyPath:属性名(用于复杂的路径)kvo键值监听  永久性的监听item属性值的改变,如果改变就从新设置             1.监听方法:[addObserver:self