在开发的系统上有一个小需求,关联两个地图,以分析不同时期相同地点的地物变化,也就是两个axMapControl之间的联动,针对这个需求简单的设计了如下的界面:
当然,这个界面比较原始,仅仅作为一个原型来说明这一功能,在用图形化界面设置ArcToolbar的Item属性的时候,一定不要把某些item选择错了,比如FullExtent和Pan,千万不要选成Scene或Global中的FullExtent和Pan,而应该选择Map Nevigation中的相应控件。左边的AxTOCControl和Toolbar绑定左边的MapControl,右边亦是如此。
设计思路分三步,首先就是在左边的leftMapControl的OnViewRefreshed()方法下绑定右侧的rightMapControl,这个很简单:
rightMapControl.Extent = leftMapControl.Extent;
rightMapControl.Refresh();
这样就实现了leftMapControl的范围改变时右边也改变,那么当rightMapControl的范围改变时leftMapControl怎样改变呢,第二步,这就需要一个指示的变量来判定鼠标是在leftMapControl还是在rightMapControl:
private string mapName = "";
//当鼠标在leftMapControl上移动时,将leftMapControl的Name属性值赋给mapName变量
private void leftMapControl_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
{
mapName = (sender as AxMapControl).Name;
}
//当鼠标在rightMapControl上移动时,将rightMapControl的Name属性值赋给mapName变量
private void rightMapControl_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
{
mapName = (sender as AxMapControl).Name;
}
最后一步,在leftMapControl和rightMapControl的OnViewRefreshed()方法下根据mapName变量的值执行各自的操作:
private void leftMapControl_OnViewRefreshed(object sender, IMapControlEvents2_OnViewRefreshedEvent e)
{
if (mapName == "leftMapControl")
{
rightMapControl.Extent = leftMapControl.Extent;
rightMapControl.Refresh();
}
}
private void rightMapControl_OnViewRefreshed(object sender, IMapControlEvents2_OnViewRefreshedEvent e)
{
if (mapName == "rightMapControl")
{
leftMapControl.Extent = rightMapControl.Extent;
leftMapControl.Refresh();
}
}
步骤比较简单,很好理解,代码已上传至github: https://github.com/ranhongwu/190710MapControlLink 。