需要开发一个查询要素并实时显示查询信息的功能,用到了arcobjects可停靠窗口(dockableForm),交互当然是用arcobjtects Tool,如何在点击事件获取要素并获取相关信息后将信息传到dockable form颇费了一番周折。惯性思维,是在tool类中声明dockableForm的实例,通过dockableForm的共有变量或属性赋值,但arcobjects的机制是在DockableWindow类里实例化了一个userControl(应该是DockableWindow负责停靠等功能,userControl负责控件定制),只提供了IDockableWindow接口和IDockableWindowManager管理器,由manager只能获取idockablewindow接口,无法获取usercontrol。
多次尝试后,找到了arcobjects的一个extension的示例代码片段解决了问题。原理是将需要暴露的usercontrol控件,声明对应的静态变量,并在构造函数中将控件与静态变量挂接。这样,在tool中查询的结果可以直接赋值给usercontrol类的静态控件,实现tool中查询结果在usercontrol中的实时显示。
之后,也通过事件实现了相同的功能:在tool中定义一个静态事件(delegate的参数为查询结果),该事件在查询结果获取后触发。由于是静态事件,在usercontrol中订阅tool类的查询事件,在事件处理器中处理该查询结果。
上面两种方法本质相同,由于在同一时刻只能传递一份数据,因此可以通过静态事件或者静态变量实现传递,区别是在哪一端定义该静态内容。
另:事件机制(发布者-订阅者机制):
class EventPublisherClass{
public delegate void SomeEventHanler(parames[]);//这个委托也可以定义在其它类中
public (static) event SomeEventHandler SomeEvent;//事件
public (static) void OnSomeEvent(Parames[]){//触发事件,可以在内部被调用,也可以在外部
if(SomeEvent!=null){
SomeEvent(Parames);
}
}
void someMethod(){
params=DataChanges();
OnSomeEvent(params);
}
}
class EventScriberClass{
someMethod(){
EventPublisherClass.SomeEvent+=EventHandler;//静态事件
EventPublisherClass epc=new EventPublisherClass();
epc.SomeEvent+=EventHandler;//实例事件
}
void EventHandler(params[]){//和publisherClass里delegate签名一致,在事件触发时被调用
}
}
标签:控件,静态,tool,ArcObjects,查询,事件,usercontrol,交互 From: https://www.cnblogs.com/jwwry/p/17022194.html