ArcObjects控件间交互

需要开发一个查询要素并实时显示查询信息的功能,用到了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签名一致,在事件触发时被调用

  }

}

 

如果是定义的一个Form,其show方法有一个IWin32Window参数表示父窗口,

可以这样form.show(Control.fromHandle((IntPtr)Arcmap.application.hwnd) as IWin32Window);

 

posted @   jwwry  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示