关于ArcGIS Eegine + C# 的开发环境的搭建--axMapControl关联axToolbarControl
GIS应用基本界面的搭建
这个界面的搭建比较简单,具体参考下面的文章:
https://malagis.com/arcgis-engine-10-develop-handbook-3-1.html
需要注意的2点:
1.必须拖入AxLicenseControl 许可控件,必须添加否则其他控件将无法使用;
2.并且通过代码的方式绑定许可。
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine);
- 1
代码放在program.cs文件的Main函数中,注意必须放Application.Run(new Form1());
之前。
控件的关联的方法
控件关联的方法有两种:
(一)通过属性进行关联:
例如我们通过axToolbarControl的属性添加了常规工具条后,里面有打开地图功能,必须指定显示的axMapControl
右键axToolbarControl—>属性---->Items 添加Generic Category
将Buddy设置为指定axMapControl
这样就是通过属性关联axToolbarControl和axMapControl控件。
(二)通过代码手动关联:
如果在界面里添加了splitcontainer 之后TOCControl与mapcontrol控件的通过设置的关联无效,
这个时候就得手动设置Buddy
在From1的load事件中添加
axTOCControl1.SetBuddyControl(axMapControl1);
- 1
布局视图(axPageLayout)和地图(axMapcontrol)关联
private void copyToPageLayout() {
//IObjectCopy接口提供Copy方法用于地图的复制 IObjectCopy objectCopy = new ObjectCopyClass(); object copyFromMap = axMapControl1.Map; object copyMap = objectCopy.Copy(copyFromMap); object copyToMap = axPageLayoutControl1.ActiveView.FocusMap; //Overwrite方法用于地图写入PageLayoutControl控件的视图中 objectCopy.Overwrite(copyMap, ref copyToMap); } private void axMapControl1_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e) { copyToPageLayout(); } private void axMapControl1_OnAfterScreenDraw(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnAfterScreenDrawEvent e) { IActiveView activeView = (IActiveView)axPageLayoutControl1.ActiveView.FocusMap; IDisplayTransformation displayTransformation = activeView.ScreenDisplay.DisplayTransformation; //根据MapControl的视图范围,确定PageLayoutControl的视图范围 displayTransformation.VisibleBounds = axMapControl1.Extent; axPageLayoutControl1.ActiveView.Refresh(); copyToPageLayout(); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
代码需要添加引用using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Carto;
其中有个地方容易出无法嵌入互操作类型错误:IObjectCopy objectCopy = new ObjectCopyClass();
当报无法嵌入互操作类型错误的时候,其实程序是可以正常执行的,解决方法
将其对应的dll组件的属性中嵌入互操作类型由True改为false。
这里对应的组件为ESRI.ArcGIS.System
还可以通过通过实例ObjectCopy接口对IObjectCopy赋值,就可以不用调dll的属性
IObjectCopy objectCopy = new ObjectCopy();
可以实例接口吗?
下篇博客对出现这个问题的原因和一些衍生的问题进行分析!
https://blog.****.net/define_lin/article/details/82716214
</div>
<link href="https://****img.cn/release/phoenix/mdeditor/markdown_views-778f64ae39.css" rel="stylesheet">
</div>