ArcObjects编程方法(四):ArcObjects .NET事件
版本:ArcGIS 10
事件是由对象发送的标示某项行为发生的信号。事件可以由人机交互操作驱动,比如鼠标点击,也可以由其他程序逻辑驱动。触发事件的对象为事件发送器,捕获事件并相应事件的对象称为事件接收器。
.NET Framework定义了委托类型提供了类似函数指针的功能,委托为事件发送器和接收器建立连接。
定义委托
委托包含的方法必须符合其签名。
[C#]
delegate int SomeDelegate(string s, bool b); //委托声明.
侦听ArcObjects事件
步骤:
1、创建事件相关接口
[C#]
IGlobeDisplayEvents_Event globeDisplayEvents =(IGlobeDisplayEvents_Event)m_globeDisplay;
2、注册事件处理方法
[C#]
globeDisplayEvents.AfterDraw += new IGlobeDisplayEvents_AfterDrawEventHandler(OnAfterDraw);
3、声明符合委托签名的方法
[C#]
private void OnAfterDraw(ISceneViewer pViewer) { //Your event handler logic. }
4、取消事件监听
[C#]
((IGlobeDisplayEvents_Event)m_globeDisplay).AfterDraw –= new IGlobeDisplayEvents_AfterDrawEventHandler(OnAfterDraw);
成员对象的事件侦听
有些时候需要绑定事件的对象是其他对象的属性成员:
[C#]
//Class members. private IGlobeHookHelper m_globeHookHelper = null; public override void OnCreate(object hook) { //Initialize the hook helper. if (m_globeHookHelper == null) m_globeHookHelper = new GlobeHookHelper(); //Set the hook. m_globeHookHelper.Hook = hook; ((IGlobeDisplayEvents_Event)m_globeHookHelper.GlobeDisplay).AfterDraw += new IGlobeDisplayEvents_AfterDrawEventHandler(OnAfterDraw);
}
上述例子可能会失败,而且不抛出任何异常和警告。因为Hook helper获得GlobeDisplay的引用,并在返回之前调用AddRef()方法。通过创建本地变量可以避免上述问题:
[C#]
//Class members. private IGlobeHookHelper m_globeHookHelper = null; private IGlobeDisplay m_globeDisplay = null; public override void OnCreate(object hook) { //Initialize the hook helper. if (m_globeHookHelper == null) m_globeHookHelper = new GlobeHookHelper(); //Set the hook. m_globeHookHelper.Hook = hook; //Get the GlobeDisplay from the hook helper. m_globeDisplay = m_globeHookHelper.GlobeDisplay; ((IGlobeDisplayEvents_Event)m_globeDisplay).AfterDraw += new IGlobeDisplayEvents_AfterDrawEventHandler(OnAfterDraw); }