天天看點

axmapcontrol的一點發現

最近在做一個功能,從主窗體彈出子窗體(包含地圖控件)顯示地圖。不過初始化的過程比較耗時(主要是連接配接遠端資料),是以想改變滑鼠樣式為等待。本來是比較簡單的思路

A:主窗體,B:子窗體

a.cursor=cursors.wiatcursor;
B b=new B();
b.init(); 
a.cursor=cursors.arrow;
b.showdialog();
           

但是,發現運作過程中,滑鼠就變成等待樣式閃了一下,就變回去了。

經過排查,發現是B的構造函數裡,初始化時控件容器加載了axmapcontrol造成的(但是pagelayout控件不影響,目前原理不明,有了解的朋友可以講解下)。是以繞了個彎子,把axmapcontrol的初始化放到外面,等初始化參數完成後再進行初始化。

給B添了一個方法

public void  addctrl()
{
  this.controls.add(mapcontrol);//将設計器裡的添加删除
  mpcontrol.endinit();
}
           

A中恢複完滑鼠樣式後再調用下該方法。

其中endinit一定要調用,否則控件的屬性和方法大都無法調用。因為axhost類繼承ISupportInitialize接口,ISupportInitialize接口用于實作對對象進行批量初始化處理時的通知事務。調用BeginInit通知對象批量初始化開始,調用EndInit告訴對象批量初始化結束。使用這個接口的意義在于:對象内部某些屬性可能具有互相依賴性,是以一些具有依賴性的處理需要在初始化完成之後才能進行。而ISupportInitialize正是為了實作這個功能而生,它的BeginInit方法的作用就是告訴對象目前正在初始化,進而不要去執行那些需要在初始化完成之後才能進行的操作。這裡,我們使用ArcGIS engine的MapControl也存在這個問題,在AxMapControl沒有被添加到控件容器中,即使調用了endinit,也被認為還沒執行個體化,其内部的一些屬性是拒絕通路的,如果使用,就出現System.Windows.Forms.AxHost+InvalidActiveXStateException異常。