前一段时间分析了MapControl和PageLayoutControl同步的一些问题,自己也根据原来的思路做了一些工作,但是存在的一个很大的问题就是,对于多文档程序,获取axPageLayoutControl1.ActiveView.FocusMap直接传递给axMapControl1时屏幕刷新老是出问题。如果对axPageLayoutControl1中的MapFrame操作过于频繁还会出现“内存损坏”的报错。感觉应该是让axPageLayoutControl1和axMapControl1共用一个IMap出了问题。
不能共用一个IMap,那就只能通过拷贝的方式了。查了兰小机的书,还真的这么说了,不过他的例程和Esri帮助文档中的有些区别,帮助文档中的帮助主题是
“Copy the PageLayoutControl focus map and overwrite the MapControl map”而兰的是从MapControl中复制到PageLayoutControl。如果通过拷贝方式实现地图同步,那么拷贝和覆写肯定是双向的。
ArcEngine中自带的地图同步的例子共用的一个IMap,能够保证刷新不出问题,我想是因为通过访问MapControl和PageLayoutControl的ActiveView激活与反激活事件起到作用了。改造地图同步类的方法到底应该如何做我现在也不太确定,拷贝的方法主要是数据的复制和覆写。至少现在实现的效果可以读取地图文档中的FocusMap,改变PageLayoutControl中的FocusMap,MapControl可以实现同步。而且也没有出现内存损坏的报告。我把原来地图同步类中的激活与反激活方法调用也删除了,这样在初始化两个视图的时候,Map显示正常了。具体的内容还要好好分析一下。
到底是共用还是拷贝呢?这是个问题。
问题不好解决啊,从PageLayoutControl数据拷贝到MapControl容易,但是在MapControl中添加数据,删除图层,这时候就有问题了,如果也采用拷贝,A——>B是用事件触发的,现在B通过事件触发A,很有可能有循环触发B。这是其一,其二,不知道在什么事件中触发回拷贝的方法。在MapControl的OnViewRefreshed事件中触发次数太多,造成拷贝方法多次调用,PageLayoutControl频繁刷新。如果直接在PageLayoutControl的FocusMap中添加方法数据、删除图层,同样不知道在什么事件中触发拷贝数据到MapControl的方法。在OnViewRefreshed触发也需要PageLayoutControl视图处于激活状态。显然都不行!不知道对Map本身的事件进行处理会怎么样!
唉,不想弄了!该死的打开包含多个Map的地图文档!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!