版本: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);
}